浮点数不是减法后的预期数

时间:2012-11-07 05:32:08

标签: java

我有以下声明:

float diff = tempVal - m_constraint.getMinVal();

tempVal被声明为float,getMinVal()返回一个浮点值。

我打印出以下内容:

diff = 0.099999905,tempVal = 5.1,m_constraint.getMinVal()= 5.0

我希望差异 0.1 ,但不是上述数字。怎么做?

4 个答案:

答案 0 :(得分:3)

Floats使用IEEE754来表示数字,并且该系统有一些舍入错误。

Floating point guide

What Every Computer Scientist Should Know About Floating-Point Arithmetic

Wikipedia on IEE754

如果您正在进行算术并且需要准确,那么请不要使用floatdouble但我们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。