保存期间小数部分舍入错误

Posted

技术标签:

【中文标题】保存期间小数部分舍入错误【英文标题】:Bad rounding of decimal part during save 【发布时间】:2013-08-12 08:10:31 【问题描述】:

我的问题是小数部分舍入不当。我在循环中保存数据。只有最后更新的项目更改不正确。 例如 - 保存的编号是 13778.12888,表中的值是 13778,1。保存:$this->save($data) - debug($data) 显示正确的值。

【问题讨论】:

你是如何定义数据库中的列的? 浮动(11)。先前的值是正确的,只有最后更新的项不正确。 【参考方案1】:

当您选择定义为FLOAT(n) 且n 小于25 的浮点类型的列时,mysql 似乎将输出四舍五入为6 位有效数字,这绝对是令人惊讶的。该值以 IEEE 单精度浮点数的全精度存储。要获得完全精确的值,你可以使用一个简单的技巧,比如加 0;看看吧:

create table numbers (f float(24));
insert into numbers set f = 12345678;
select f from numbers;
-- 12345700
select f + 0 from numbers;
-- 12345678

使用双精度类型FLOAT(53) 不会得到这种舍入效果,但会使用两倍的存储空间。

【讨论】:

谢谢。您的建议很有帮助。

以上是关于保存期间小数部分舍入错误的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 vb.net 中双精度数的舍入错误?

JS实现浮点数精确舍入小数点

SQL Server 错误或功能?小数转换

将浮点数与字符串连接并舍入到小数点后 2 位

Math.round() 函数返回一个数字四舍五入后最接近的整数。

不能将小数舍入到R中的两位小数