比较浮点数舍入失败 System.Math.RoundTo C++ XE7

comparison float rounding fails System.Math.RoundTo C++ XE7

我一直试图将浮点值四舍五入到 4 精度但没有成功。

float fconv = 1.0f;
float fdata = 39.934543423412f;
float fres = RoundTo(fdata*fconv, -4);

if(fres <= 39.9345f){do something;} //<-- unwanted behavior

想要的结果是 39.934500000000
实际结果是 39.934543423412

我尝试了很多方法,包括 Round a float to a given precision 都没有成功。

我正在开发 AMD FX83xx 64 位。程序是使用 XE7

在 32 位调试中构建的

谢谢

您所需的 6 位小数精度非常接近浮点数据类型的精度限制。对于 40f 左右的数字,epsilon 或连续可表示浮点值之间的增量约为 7.63E-6,因此 'best' 值与您得到的值之间只有几位不同。这可能是由于四舍五入接近极限,但我不确定。