Java双变量有奇怪的值

Java双变量有奇怪的值,java,double,division,Java,Double,Division,可能重复: 我在做这个简单的除法,但得到了一个非常奇怪的结果: double a = 60/(1.2-1.1); a=>600.0000000000008 应该是600 提前感谢,因为double原语是一种数据类型,它以精度换取保存更大范围值的能力 如果你需要任意精度,你应该改用。你已经发现了浮点运算的神奇之处。由于数字的内部表示是二进制的,因此某些十进制数字无法精确表示。因此,某些算术运算将以最低有效位给出意外结果 例如,在《数值方法》课程中,这一点被详尽地介绍过,但也不错。您可能应该阅读

可能重复:

我在做这个简单的除法,但得到了一个非常奇怪的结果:

double a = 60/(1.2-1.1);
a=>600.0000000000008

应该是600


提前感谢

,因为double原语是一种数据类型,它以精度换取保存更大范围值的能力


如果你需要任意精度,你应该改用。

你已经发现了浮点运算的神奇之处。由于数字的内部表示是二进制的,因此某些十进制数字无法精确表示。因此,某些算术运算将以最低有效位给出意外结果

例如,在《数值方法》课程中,这一点被详尽地介绍过,但也不错。

您可能应该阅读


简而言之,并非所有实数都可以用双精度(双精度)表示,因此在需要精确答案时应避免使用它们。

这不是精确的“舍入问题”。某些数字不能用二进制浮点精确表示。就像1/3不能精确地用十进制表示一样,因为没有人有无限的纸张供应。

你应该使用BigDeCalbit来得到正确的结果。在IEEE-75 4二进制中,

< P>:在二进制表示中需要考虑1.1和1.2:

1.2 = 0b1.001100110011001100110011001100110011001100110011001100110011...
1.1 = 0b1.000110011001100110011001100110011001100110011001100110011001...
请注意,我们需要无限多个位来准确地用二进制表示它们。double只有53位意义,我们必须切掉数字:

1.2 = 0b1.001100110011001100110011001100110011001100110011001100110011...
1.1 = 0b1.000110011001100110011001100110011001100110011001100110011001...
                                                              ^ round from here
==>
1.2 ~ 0b1.0011001100110011001100110011001100110011001100110011
      (= exactly 1.1999999999999999555910790149937383830547332763671875)
1.1 ~ 0b1.0001100110011001100110011001100110011001100110011010
      (= exactly 1.100000000000000088817841970012523233890533447265625)
因此,1.2-1.1是:

  1.2 ~ 0b1.0011001100110011001100110011001100110011001100110011
- 1.1 ~ 0b1.0001100110011001100110011001100110011001100110011010
————————————————————————————————————————————————————————————————
        0b0.00011001100110011001100110011001100110011001100110010000
        (= exactly 0.09999999999999986677323704498121514916419982910156250000)
我们可以精确地计算60/0.0999999999998667732370449812151491641998291015625

600.0000000000007993605777301137740672368493927467455286920109359612256820927...
                ^ 16th significant figure
这与OP的测试结果相符

600.0000000000008

请尝试为分母创建第二个双变量:双b=1.2-1.1;双a=60/b;同样的结果?你应该了解一些你以前的经验answers@AndrewThompson不,这根本不是那个的复制品。这个问题与整数除法和实浮点除法之间的区别有关。这个问题与并非所有实数都有64位浮点表示的事实有关。@MartijnCourteaux也不是dup。如果你正在寻找一个重复的问题,一个更好的例子是。嘿,伙计们,请不要把这个问题作为关于整数除法的重复问题来结束。这个问题是浮点运算的问题,不是整数除法的问题。我很确定图灵有无限多的位…或者至少他是这么说的…图灵机器根据定义有无限多的位,但让我们看看你买了一个。+1。虽然我添加了一个真实世界的十进制数和1/3.Wow的例子,但你比我强。现在我知道你是怎么拿到114k分的了。现在他拿到了412K:)