我正在使用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还是数据库?处理这种浮点交互以避免不精确的正确方法是什么?
谢谢!
答案 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。