MySQL内部将浮点值四舍五入到小数点后一位

rwqw0loc  于 2023-11-16  发布在  Mysql
关注(0)|答案(2)|浏览(131)

我有一个mysql数据库,表X有浮点数无符号列数量。
当该值小于10000时,将正确保存该值,保留两位小数。
但对于更多的数据,它是四舍五入两位小数到一位。
我不知道是否>10000是造成这一点,但这是主要的嫌疑人。
该值正在Map到应用程序实体中的浮点数。
我不知道为什么有些数值会被四舍五入。
有人遇到过类似的问题吗?

yzuktlbb

yzuktlbb1#

MySQL根据Float列的长度存储值时执行舍入。快速解决方法是在MySql表中设置Float列的长度,例如FLOAT(11,2)
MySQL参考可以在这里找到:Floating-Point Types (Approximate Value)

t40tm48m

t40tm48m2#

MySQL本质上是硬编码的,以四舍五入长度超过6位的FLOAT值。
MySQL使用FLT_DIG常量(在IEEE 754编码中等于6)来打印浮点型数字。FLT_DIG是可以转换为浮点型二进制数并转换回来的十进制数字的数量,而不会损失 * 任何 * 输入数字的精度。这并不意味着没有可以用二进制格式精确表示的具有更高有效位的数字(你的例子就是这样一个数字的例子),但是常量确保了所有输入的属性。
双类型数的一个等效常数称为DBL_DIG,在IEEE 754编码中等于15。双类型数从十进制表示到二进制表示的转换由dtoa库处理。该库允许对那些可能进行此类转换的数字精确转换长于DBL_DIG数字的输入。遗憾的是,该库仅对双类型数进行操作,没有浮动类型的版本。
回到你的例子,它们是两件事的组合:

  • 输入数字的精度高于FLT_DIG精度,因此可以舍入为二进制并转换回十进制表示,但不保证。
  • MySQL在所有的计算中都将浮点型数字转换为双精度型。这就是为什么(value + 0)、MIN(value)和MAX(value)会产生更精确的十进制表示-- dtoa在这些情况下打印双精度数字,所以打印至少15位十进制数字是安全的。

我的建议是完全避免FLOAT数据类型,或者准备好处理像这里演示的异常。DOUBLE数据类型不仅提供更高的精度,而且在这种情况下更一致。

相关问题