为什么java里面3*0.1=0.30000000000000004

2021-03-17 06:27

阅读:388

标签:表示   字符串   int   tin   使用   most   通过   浮点   nal   

什么是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

标签:表示   字符串   int   tin   使用   most   通过   浮点   nal   

原文地址:https://www.cnblogs.com/ShuaiStudy/p/13983442.html


评论


亲,登录后才可以留言!