【问题标题】:Casting 1 to decimal returns 0.9999 instead of 1.0000 in MySQL将 1 转换为十进制返回 0.9999 而不是 MySQL 中的 1.0000
【发布时间】:2023-03-18 23:28:01
【问题描述】:

在 MySQL 中将 1 转换为十进制时,我期待的是 1.0000,但输出却是 0.9999

这里到底发生了什么?

SELECT CAST(1 AS DECIMAL(4,4))

【问题讨论】:

标签: mysql casting


【解决方案1】:

超出范围

例如,DECIMAL(5,2) 存储任何五位数和两位小数的值,其范围从 -999.99 到 999.99。

SELECT CAST(1 AS DECIMAL(5,4)) -> 1.0000
SELECT CAST(1 AS DECIMAL(4,3)) -> 1.000
SELECT CAST(0.0001 AS DECIMAL(4,4)) -> 0.0001
SELECT CAST(0.00001 AS DECIMAL(4,4)) -> 0.0000
SELECT CAST(12345 AS DECIMAL(5,4)) -> 9.9999

更多信息:

https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html https://dev.mysql.com/doc/refman/5.7/en/fixed-point-types.html

【讨论】:

    【解决方案2】:

    当您尝试将整数(在您的情况下为 1)转换为具有 精度 n 即总位数的十进制数 DECIMAL(n,m) strong>(在您的情况下为 n=4)和 缩放为 m 即小数点后的位数(在您的情况下为 m=4)

    所以在你的情况下十进制数的范围是(-0.9999 到 0.9999)

    因此,当您尝试转换任何整数 > 0 时,它将被转换为 0.9999(最大可能值)

    当您尝试转换任何整数 时,它将被转换为 -0.9999(可能的最小值)

    如果服务器在严格模式下运行,这种转换会导致错误。

    【讨论】:

    • m 不是刻度,是小数位数。
    【解决方案3】:

    MySQL 正在将转换后的值裁剪为适合目标类型的最大值。 decimal(4, 4) 不会在小数点左侧分配任何有效数字。

    只有当服务器没有运行documentation 中描述的严格模式时,这种转换才不会导致溢出。

    【讨论】:

      猜你喜欢
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2016-06-13
      相关资源
      最近更新 更多