【问题标题】:losing decimal precision in string filed when updating MySQL table更新 MySQL 表时丢失字符串字段中的小数精度
【发布时间】:2021-08-04 13:21:09
【问题描述】:

我有一个 varchar(255) 数据类型的文件。当我运行这个查询时:

update sample_tbl 
set in_order_real = in_order_real + 21.215541764099030466 
where id = 15

它会删除多余的小数。

例如in_order_real 数字是0,当我运行此查询时,它只保留一些小数并在它是一个字符串字段时四舍五入。我该如何解决这个问题?

【问题讨论】:

  • 如果你在这个字段中存储小数,为什么不使用小数类型,而不必一直转换为varchar?
  • @Akina 我认为这是因为 mysql 十进制限制。但我提交的是字符串数据类型。为什么mysql看这个像一个十进制数?你有演员的样本吗?
  • @GarethD 因为我不知道小数部分的计数。可能是 8 或 30
  • 我不知道小数部分知道它的最大可能值就足够了。例如,“不能超过 40”。

标签: mysql sql-update decimal


【解决方案1】:

您必须以适当的精度将字符串值转换为 DECIMAL。

CREATE TABLE sample_tbl (id INT, in_order_real VARCHAR(255))
SELECT 15 id, 1.23 in_order_real
UNION ALL
SELECT 16, 1.23;

SELECT * FROM sample_tbl;
id in_order_real
15 1.23
16 1.23
update sample_tbl 
set in_order_real = in_order_real + 21.215541764099030466 
where id = 15;

update sample_tbl 
set in_order_real = CAST(in_order_real AS DECIMAL(30, 18)) + 21.215541764099030466 
where id = 16;
SELECT * FROM sample_tbl;
id in_order_real
15 22.44554176409903
16 22.445541764099030466

db小提琴here

如果您不知道实际的小数位数,请使用最大可能值。此外,您可以修剪结果中的尾随零。

【讨论】:

    【解决方案2】:

    FLOAT 包含 24 个有效位——大约 7 个十进制有效位。

    DOUBLE: 53 和 16

    因此,将 21.215541764099030466 放入 FLOAT 会在大约 7 位后出现乱码:~21.21554。对于DOUBLE:~21.21554176409903

    无法在VARCHARs 中进行算术运算;它被转换为DOUBLEDECIMAL

    您的号码来自哪里?花钱请使用DECIMAL(..., 2);对于传感器读数,请使用FLOAT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      相关资源
      最近更新 更多