如何阻止 mysql 舍入浮点值?

Posted

技术标签:

【中文标题】如何阻止 mysql 舍入浮点值?【英文标题】:how can I stop mysql from rounding float values? 【发布时间】:2017-05-20 10:00:24 【问题描述】:

我将货币值作为浮点数存储在 mysql 表中。

问题是,mysql 正在向上或向下舍入数字。

例如。 12345.68 舍入为 12345.7

我怎样才能阻止这种情况,或者我应该使用更好的数据类型吗?

我想保留小数点后 2 位内的原始值。

【问题讨论】:

【参考方案1】:

将适用列的定义从其当前设置更改为:

FLOAT(9,2)

前面sn-p 中的2 指示MySQL 将值保留至小数点后2 位。目前可能设置为1;因此观察到的行为。随意将9 更改为更适用的值。

更多关于floats and precision。

Related answer, which advises on not using floats, but instead decimal.

【讨论】:

@Ivan Georgiev 的回答应该是被接受的。【参考方案2】:

不要使用FLOAT 类型。请改用DECIMAL。浮点数将十进制数转换为二进制数,这会导致舍入(精度损失)。 Decimal 将数字存储为小数 - 无需转换。

在您的情况下,将列定义为 DECIMAL(12,2) 应该没问题。根据数字的预期大小选择宽度(第一个数字)。在示例中,预期大小为 12 位(包括小数点后的数字)。

【讨论】:

以上是关于如何阻止 mysql 舍入浮点值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 extjs4.1 中舍入浮点值

MySQL JSON存储不同的浮点值

如何在包含浮点数和 Nan 或 None 值的同一列中舍入浮点值?

为啥 roundf() 不对浮点值进行舍入,为啥 int - float 数学运算返回错误值?

变体浮点到双精度值转换,舍入到小数点后 1 位 [重复]

Enumerable#sum 如何避免浮点舍入错误?