为什么java里面3*0.1=0.30000000000000004
2021-03-17 06:27
标签:表示 字符串 int tin 使用 most 通过 浮点 nal 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中验证) 结论: 翻译: 为什么java里面3*0.1=0.30000000000000004 标签:表示 字符串 int tin 使用 most 通过 浮点 nal 原文地址:https://www.cnblogs.com/ShuaiStudy/p/13983442.html什么是round-trip?
这并不是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
文章链接:http://soscw.com/essay/65195.html