Perl / mysql浮点不精确

时间:2014-06-24 23:51:49

标签: mysql perl floating-point

我正在使用Perl与mysql数据库通信浮点数。我在perl中执行乘法运算:

 $var = 0.001 * 3;

然后我将此值存储在类型为DOUBLE的列中的mysql数据库中。我稍后检索结果,对数字进行进一步的乘法和加法,并将其存储回数据库

$previous_result_from_db += 0.001*1 + 0.001*0.5.

存储在数据库中的结果应该 0.0045 ,而是得到: 0.0045000000000000005 。我试图了解不精确的来源在哪里。它是Perl还是数据库?处理这种浮点交互以避免不精确的正确方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

" 10.0倍0.1几乎不是1.0" - Brian Kernighan,编程风格元素

FLOAT和DOUBLE的一个已知限制是它们是不精确的数字数据类型。这内置于IEEE 754格式的设计中。它会影响使用此格式存储浮点数的所有编程语言。

MySQL在本附录中记录了这一点:B.5.5.8 Problems with Floating-Point Values

PHP在Warning: Floating point precision中记录了这一点。

如果您希望MySQL中的缩放数字数据类型避免此舍入行为,请使用DECIMAL