我有以下声明:
float diff = tempVal - m_constraint.getMinVal();
tempVal
被声明为浮点数并getMinVal()
返回浮点值。
我有以下打印输出:
diff=0.099999905, tempVal=5.1, m_constraint.getMinVal()=5.0
我希望差异是0.1,但不是上面的数字。怎么做?
我有以下声明:
float diff = tempVal - m_constraint.getMinVal();
tempVal
被声明为浮点数并getMinVal()
返回浮点值。
我有以下打印输出:
diff=0.099999905, tempVal=5.1, m_constraint.getMinVal()=5.0
我希望差异是0.1,但不是上面的数字。怎么做?
浮点数使用IEEE754
来表示数字,并且该系统存在一些舍入误差。
底线,如果您正在做算术并且需要准确,请不要使用或float
使用BigDecimaldouble
由于它们在内部存储值的方式,浮点数和双精度数只能存储完全准确的数字,这些数字可以分解为 2 的幂的总和(然后,在与其绝对和相对大小相关的某些约束内)。
因此,一旦您尝试存储或执行涉及的计算,一个无法准确存储的数字,您将在最后一位数字中得到错误。
如果您使用浮点数和双精度数并采取一些预防措施,通常这不是问题:
使用具有超出您需要的“备用”精度的浮点原语大小;
对于许多应用程序,这可能意味着根本不使用浮点数(改用双精度数):它的精度很差,除了除法之外,在许多处理器上都没有性能优势;
打印 FP 数字时,只实际打印并考虑您需要的精度位数,当然不包括最后一位(使用 String.format 来帮助您);
如果您需要任意位数的精度,请改用 BigDecimal。
您无法使用ing 点数获得exact
结果。float
您可能需要为此使用 FixedPoint 库。请参阅:http: //sourceforge.net/projects/jmfp/
Java 使用IEEE 754中定义的二进制浮点表示对实数进行编码。像所有有限表示一样,它不能准确地表示所有实数,因为实数比潜在表示要多得多。无法精确表示的数字(如您的情况下的 0.1)将四舍五入到最接近的可表示数字。