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

Ruby浮点精度

发布时间:2020-12-16 19:13:51 所属栏目:百科 来源:网络整理
导读:据我了解,Ruby(1.9.2)浮点数的精度为15位十进制数.因此,我希望舍入浮点x到15位小数将等于x.对于这种计算,情况并非如此. x = (0.33 * 10)x == x.round(15) # = false 顺便说一句,舍入到16位返回true. 你能解释一下吗? 解决方法 问题的一部分是0.33在底层格式
据我了解,Ruby(1.9.2)浮点数的精度为15位十进制数.因此,我希望舍入浮点x到15位小数将等于x.对于这种计算,情况并非如此.
x = (0.33 * 10)
x == x.round(15) # => false

顺便说一句,舍入到16位返回true.

你能解释一下吗?

解决方法

问题的一部分是0.33在底层格式中没有精确的表示,因为它不能用一系列1 / 2n项表示.因此,当它乘以10时,与0.33略有不同的数字相乘.

就此而言,3.3也没有确切的表示.

第一部分

当数字没有精确的基数为10的表示时,在转换尾数中有信息的最低有效数字时会有一个余数.这个余数将传播到右边,可能是永远的,但它在很大程度上毫无意义.这个错误的明显随机性是由于同样的原因解释了你和Matchu注意到的明显不一致的舍入.这是第二部分.

第二部分

并且这些信息(最右边的位)与单个十进制数字所传达的信息不完全对齐,因此十进制数字通常会比原始精度更高时的值小一些.

这就是为什么转换可能在15位数时舍入为1而在16位数时为0.x:因为较长的转换对于尾数末尾右侧的位没有值.

(编辑:李大同)

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

    推荐文章
      热点阅读