在项目里遇到一个很诡异的问题,因为有一些浮点数的计算,总是失败,所有将出问题的变量打印到日志里。
结果如下:
引用
====reicpe_blocked 1.9
====real_block 1.9
是这样的,recipe_blocked变量值是:1.9,real_block变量值是1.9,两个结果相减结果是result,但是在程序对result有个判断,判断result是否大于0小于0还是等于,本来正确的结果是等于,但是最后却到了小于这里。
google搜索了下,找到了两个关于ruby浮点数的帖子。
http://www.iteye.com/problems/37144
http://pickerel.iteye.com/blog/796405
在本地试了下
引用
>> e = 0.477+(0.432-0.477)*(5-4.7)/(5.7-4.7)
=> 0.4635
>> e.round(3)
=> 0.463
>> a=0.4635
=> 0.4635
>> a.round(3)
=> 0.464
引用
>> 10.12*100
=> 1012.0
>> (10.12*100).to_i
=> 1011
>> (10.12*100).to_f.to_i
=> 1011
>> (10.12*100).to_f.round(2).to_i
=> 1012
>> (10.12*100).to_s.to_i
=> 1012
引用
>> e = (0.477).round(3)+((0.432-0.477)*(5-4.7)/(5.7-4.7)).round(3)
=> 0.464
>> e = (0.477).round(4)+((0.432-0.477)*(5-4.7)/(5.7-4.7)).round(4)
=> 0.4635
>> e.round(3)
=> 0.463
>> e.inspect
=> "0.4635"
>> e.to_f.round(3)
=> 0.463
>> e.to_s.to_f.round(3)
=> 0.464
引用
>> e=0.477+(0.432-0.477)*(5-4.7)/(5.7-4.7)
=> 0.4635
>> e-0.4635
=> -5.55111512312578e-17
>> e.to_s.to_f-0.4635
=> 0.0
看来加上to_s.to_f还是有效果的。还是精度的问题。
分享到:
相关推荐
关于浮点数的精度问题,对于了解和学习C语言有一定帮助
目前支持二进制浮点数的硬件和软件文档中,几乎都声称其浮点数实现符合IEEE 754标准。那么,什么是IEEE 754标准? 最权威的解释是IEEE754标准本身ANSI/IEEE Std 754-1985《IEEE Standard for Binary Floating-Point...
C语言中浮点数精度问题分析.pdf
c语言浮点数高精度加法计算
单精度浮点数,双精度浮点数,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
浮点数精度
本代码将双精度浮点数转换为单精度浮点数,适合浮点数为正值的转换。 使用后将占用VD2810~VD2970字节,欢迎交流。 本代码的完成经历了一段时间的刻苦研究,无偿提供给真正需要的人,希望同行少走弯路。 代码允许复制...
浮点数转换器,可将浮点数、单精度 双精度的数值转换为16进制发送
单精度双精度浮点数转换,浮点数与16进制转换工具
S7-200SMART_双精度浮点数转换为单精度浮点数库文件及使用说明
浮点数和十六进制数的相互转换,包括:1.单精度浮点数(32位)和十六进制数的相互转换,2.双精度浮点数(64位)和十六进制数的相互转换。
主要介绍了PHP浮点数精度问题汇总,本文着重探讨PHP浮点数精度损失问题,用三个段落不同的方式讲解了这个问题的形成原因以及解决方法,需要的朋友可以参考下
对S7-200PLC双精度浮点数转单精度浮点数例程的一点补充,远程抄表相关技术的交流
PHP 中的整型大小和平台有关,通常最大值是二十亿,64位平台下最大值通常为 9E18,当程序中需要处理的数值超出整形的范围,数值将会被解释为浮点数。
双精度浮点数、单精度浮点数与十六进制,二进制之间可以进行任意转换
给大家介绍了Java中浮点数精度问题的解决方法,本文给大家介绍的非常详细,有问题描述有原因分析,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
NULL 博文链接:https://xide829.iteye.com/blog/663554
IEEE754字节转单精度/双精度浮点数