java - double 舍入误差?

标签 java floating-point double floating-point-precision

当我运行以下代码时:

double x = 4.35;
double y = x * 100;
System.out.println(y);

我得到434.99999999999994由于浮点精度的性质,这是预期的。但是当我运行时:

double x = 4.35;
double y = x * 1000;
System.out.println(y);

我得到4350.0在控制台中。同样,当我替换 1000 时与 10 ,我得到43.5 ,这很奇怪,因为这些数字没有舍入误差。当我将双倍乘以 10 to the power of the number of decimal places 时,似乎只有舍入误差。为什么会这样?

此外,当我尝试使用 4.25 运行这三个代码块时作为我的值 x ,我得到了一个不错的425.0在控制台中。舍入误差是否仅适用于某些小数值?

编辑: 将 4.35 除以 10 也得到了一个古怪的小数(准确地说是 0.43499999999999994)。另外,如果我将 x 设置为 43.5,则根本不会出现舍入错误。乘以 10 得到 435.0。

编辑2:我认为有些人误解了我的问题。我问的是为什么会发生这种情况,而不是如何避免遇到这些错误。

最佳答案

不产生任何舍入误差的计算是那些可以在二进制系统中精确表示的计算。这包括所有整数,例如 0.5 个十进制,即 0.1 个二进制,或 0.25 个十进制,即 0.01 个二进制。因此,您发布的示例没有舍入误差。然而,小数 0.35 不能用有限多个二进制数字表示。

关于java - double 舍入误差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26081326/

相关文章:

java - Java中如何判断子类的类类型

c++ - c++ 有等效的 boost::numeric_cast<DestType>(SourceType) 吗?

java - 设置浮点精度

swift - 我可以在不复制粘贴的情况下将相同的扩展应用于许多类吗?

java - 如何添加项目以在任何地方使用而不更改另一个项目中的任何内容

java - 使用 Maven 和 Netbeans 将 java 源代码 1.7 编译为 1.6

c++ - float 限制代码不产生正确的结果

ios - 将双数组添加到 nsmutablearray

floating-point - binary32 和 binary64 的有效十进制数字

java - Java 正则表达式的另一种模式