我正在使用Perl与mysql数据库通信浮点数。我在perl中执行乘法:
$var = 0.001 * 3;
然后,我将此值存储在mysql数据库中类型为DOUBLE的列中。我稍后检索结果,对数字进行进一步的乘法和加法,然后将其存储回数据库中
$previous_result_from_db += 0.001*1 + 0.001*0.5.
存储在数据库中的结果应为0.0045,但我得到的是:0.0045000000000000005。我试图了解不精确度的来源。是Perl还是数据库?避免这种不精确的处理浮点交互的正确方法是什么?
谢谢!
“ 10.0乘以0.1几乎永远不会是1.0” – Brian Kernighan,编程风格的要素
FLOAT和DOUBLE的局限性是它们是不精确的数字数据类型。这内置于IEEE 754格式的设计中。它会影响使用此格式存储浮点数的所有编程语言。
MySQL在此附录中对此进行了记录:B.5.5.8浮点值问题。
PHP在警告:浮点精度中对此进行了说明。
如果要在MySQL中使用可缩放的数值数据类型来避免这种舍入行为,请使用DECIMAL。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句