4

我有以下声明:

float diff = tempVal - m_constraint.getMinVal();

tempVal被声明为浮点数并getMinVal()返回浮点值。

我有以下打印输出:

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

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

4

4 回答 4

3

浮点数使用IEEE754来表示数字,并且该系统存在一些舍入误差。

浮点指南

每个计算机科学家都应该知道的关于浮点运算的知识

IEE754 上的维基百科

底线,如果您正在做算术并且需要准确,请不要使用或float使用BigDecimaldouble

于 2012-11-07T05:33:56.160 回答
1

由于它们在内部存储值的方式,浮点数和双精度数只能存储完全准确的数字,这些数字可以分解为 2 的幂的总和(然后,在与其绝对和相对大小相关的某些约束内)。

因此,一旦您尝试存储或执行涉及的计算,一个无法准确存储的数字,您将在最后一位数字中得到错误。

如果您使用浮点数和双精度数并采取一些预防措施,通常这不是问题:

  • 使用具有超出您需要的“备用”精度的浮点原语大小;

  • 对于许多应用程序,这可能意味着根本不使用浮点数(改用双精度数):它的精度很差,除了除法之外,在许多处理器上都没有性能优势;

  • 打印 FP 数字时,只实际打印并考虑您需要的精度位数,当然不包括最后一位(使用 String.format 来帮助您);

  • 如果您需要任意位数的精度,请改用 BigDecimal。

于 2012-11-07T05:45:31.417 回答
0

您无法使用ing 点数获得exact结果。float您可能需要为此使用 FixedPoint 库。请参阅:http: //sourceforge.net/projects/jmfp/

于 2012-11-07T05:34:13.390 回答
0

Java 使用IEEE 754中定义的二进制浮点表示对实数进行编码。像所有有限表示一样,它不能准确地表示所有实数,因为实数比潜在表示要多得多。无法精确表示的数字(如您的情况下的 0.1)将四舍五入到最接近的可表示数字。

于 2012-11-07T05:37:46.660 回答