为什么java里面3*0.1=0.30000000000000004

Posted 博客帅帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么java里面3*0.1=0.30000000000000004相关的知识,希望对你有一定的参考价值。

什么是round-trip?

Any double-precision floating-point number can be identified with at most 17 significant decimal digits. This means that if you convert a floating-point number to a decimal string, round it (to nearest) to 17 digits, and then convert that back to floating-point, you will recover the original floating-point number. In other words, the conversion will round-trip.

解释:任何浮点数可以最多被17位十进制数字表示,这意味着如果你转换一个浮点数为十进制字符串需要保留17位数字,这样可以通过这17位数字转换恢复原来的浮点数,这种转换就是round-trip

我们知道了0.1,0.2...0.9,1在计算机保存中的真实值是

但是我们使用Java打印出来的0.1,0.2...0.9,1却是

咋一看,除了0.3打印的很奇怪,精确到小数点后17位,其他好像都是精确到小数点后16位,这就说明 Integer.toString(int)这个方法不是简单的四舍五入,而是所有round-trip字符串中最短的字符串~

为什么0.3不能和真实值round-trip,因为Java不一样,Java在程序中计算出的0.1,0.2...0.9,1是这样的

(ps:可以在Decimal to Floating-Point Converter中验证)
这并不是0.1,0.2...0.9,1的真正转化,这种计算的目的是保留到小数点后一位时仍然可以round-trip,比如0.3可以和0.299999999999999988897769753748434595763683319091796875相互转化,只有0.30000000000000004才能和真实值round-trip。

结论:
The floating-point numbers represented by the long strings are printed that way because no shorter strings (e.g., 0.3, 0.8, 0.9, and 1.0) will round-trip.

翻译:
被打印成长字符串的浮点数比如(0.3,0.8,0.9,1.0)是因为打印出的字符串
(如:0.30000000000000004)是满足round-trip字符串中最短的一个

以上是关于为什么java里面3*0.1=0.30000000000000004的主要内容,如果未能解决你的问题,请参考以下文章

关于java中float的循环增值问题

Ubuntu16.04 - 安装gtk+-3.0和appindicator3-0.1

java(第二周:计算)

3*0.1 == 0.3 将会返回什么?true 还是 false?

3 * 0.1 == 0.3 将会返回什么?true 还是 false?

17为什么0.1 + 0.2 不等于 0.3