Java中具有双精度的奇数结果

Java中具有双精度的奇数结果,java,floating-point,double,Java,Floating Point,Double,我只是试图计算百分比_imp,但我得到的不是0.22(正好是0.22,没有舍入误差),而是0.22000000000000003!! 我曾经得到过类似的奇怪结果,有人告诉我从float移动到double,但这个结果仍然很奇怪! 下面的所有变量都是双精度的 double percentage_imp= budget - (sum_minlessi)/ (sum_i + sum_lessi); 0.22不能表示为双精度 例如,1/3不能以10为基数表示,因此我们用0.3333进行近似计算。0.2

我只是试图计算百分比_imp,但我得到的不是0.22(正好是0.22,没有舍入误差),而是0.22000000000000003!! 我曾经得到过类似的奇怪结果,有人告诉我从float移动到double,但这个结果仍然很奇怪! 下面的所有变量都是双精度的

double percentage_imp= budget -  (sum_minlessi)/ (sum_i + sum_lessi);

0.22不能表示为双精度


例如,1/3不能以10为基数表示,因此我们用0.3333进行近似计算。

0.22不能表示为双精度


例如,1/3不能用基数10表示,因此我们用0.3333进行近似。

这是因为浮点精度值

你必须阅读:


您还必须读取。

这是因为浮点精度值

你必须阅读:


您还必须阅读。

这是二进制计算中继承的舍入错误。并非所有有理十进制数都可以用二进制表示为单个十进制数。因此,当您执行乘法和除法等操作时,最后几位数字会出现严重错误

从double移动到float不会改变这一点,因为double只是一个双精度浮点数

我建议你看看这个


作为java中的一个额外好处,简单的操作(如二进制乘法)尽可能地优化,在可能的情况下利用任何类型的硬件优化在不同的机器上产生不同的答案。如果您要求所有计算机的行为一致,请在类声明中使用
strictfp
关键字。

这是二进制计算中继承的舍入错误。并非所有有理十进制数都可以用二进制表示为单个十进制数。因此,当您执行乘法和除法等操作时,最后几位数字会出现严重错误

从double移动到float不会改变这一点,因为double只是一个双精度浮点数

我建议你看看这个


作为java中的一个额外好处,简单的操作(如二进制乘法)尽可能地优化,在可能的情况下利用任何类型的硬件优化在不同的机器上产生不同的答案。如果您需要在所有机器上保持一致的行为,请在类声明中使用
strictfp
关键字。

See听起来是时候学习浮点实际工作原理了;)看,听起来是时候学习浮点运算的实际工作原理了;)我知道这是异端邪说,但我不觉得这页对初学者很有用。对于那些已经有点像浮子的人来说,这真是太棒了(甚至是必要的!),他们想真正理解浮子,但这不是开始的地方。我在上面发布了一个我认为更适合作为介绍的链接。@yshavit:-我刚刚更新了第二个链接,以参考浮点运算是如何工作的。希望这对初学者来说是有意义的!我知道这是异端邪说,但我不觉得这页对初学者很有用。对于那些已经有点像浮子的人来说,这真是太棒了(甚至是必要的!),他们想真正理解浮子,但这不是开始的地方。我在上面发布了一个我认为更适合作为介绍的链接。@yshavit:-我刚刚更新了第二个链接,以参考浮点运算是如何工作的。希望这对初学者来说是有意义的!