java 3 0.1_为什么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在计算机保存中的真实值是

753551a69057caa59d64d846f2efe3fd.png

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

e6d01c219177d7dc2684cc2d410b9674.png

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

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

de27eff7a4bdb5f6ffeba3fba877572a.png

(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字符串中最短的一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值