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