加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 为什么sprintf以5.555和0.555的小数部分不同?

发布时间:2020-12-15 23:34:58 所属栏目:大数据 来源:网络整理
导读:参见英文答案 Perl rounding error again????????????????????????????????????5个 有人可以解释为什么这里的行为存在差异吗? perl -E 'say sprintf("%.2f",5.555);'5.55 perl -E 'say sprintf("%.2f",0.555);'0.56 我已经读过如果以下数字是5或更大,sprint
参见英文答案 > Perl rounding error again????????????????????????????????????5个
有人可以解释为什么这里的行为存在差异吗?

perl -E 'say sprintf("%.2f",5.555);'
5.55    

perl -E 'say sprintf("%.2f",0.555);'
0.56

我已经读过如果以下数字是5或更大,sprintf()会向上舍入.那么为什么在第二种情况下它不能达到0.56呢?

解决方法

最接近的IEEE 754 64位二进制浮点数为0.555是0.55500000000000004884981308350688777863979339599609375.它略微接近0.56而不是0.55.

最接近的IEEE 754 64位二进制浮点数为5.555是5.55499999999999971578290569595992565155029296875.它略微接近5.55而不是5.56.

在每种情况下,输出都是最接近的十进制数,其中包含内部数字实际值的2位小数.

正如Pascal Cuoq在评论中所说,0.555在binade [0.5 … 1]中,其中可表示的浮点数由2-53分隔.相比之下,5.555位于binade [4 … 8]中,其中可表示的浮点数以2-50分隔.这就是0.555和5.555的小数部分不同的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读