截断和舍入给出比 MySQL 中预期更多的小数

Truncate and Round giving more Decimals than expected in MySQL

我正在尝试通过代表美元价值的 ODBC 连接获取 Pervasive SQL 数据库中的值,并将它们四舍五入到最接近的美分。但是,每当我 运行 TRUNCATE 或 ROUND 函数时,小数点后的数字比预期的要多。

例如命令

select TRUNCATE(1234.12346345766,2), ROUND(1234.12346345766,2), TRUNCATE(ROUND(1234.12346345766,2),2);

returns以下

+------------------------------+---------------------------+---------------------------------------+
| TRUNCATE(1234.12346345766,2) | ROUND(1234.12346345766,2) | TRUNCATE(ROUND(1234.12346345766,2),2) |
+------------------------------+---------------------------+---------------------------------------+
|           1234.1199999999999 |        1234.1199999999999 |                    1234.1099999999999 |
+------------------------------+---------------------------+---------------------------------------+

我所期望的是这样的

+------------------------------+---------------------------+---------------------------------------+
| TRUNCATE(1234.12346345766,2) | ROUND(1234.12346345766,2) | TRUNCATE(ROUND(1234.12346345766,2),2) |
+------------------------------+---------------------------+---------------------------------------+
|                      1234.12 |                   1234.12 |                               1234.12 |
+------------------------------+---------------------------+---------------------------------------+

我该怎么做才能解决这个问题?

我自己弄明白了,但我没有找到任何其他 post 回答这个确切的问题(如果有请不要杀了我)。

看起来这是因为值存储为双精度值而不是十进制值(由于我工作环境的限制,我看不到 table 架构。)

有效的解决方案是通过将查询包装在 CAST() 函数中,将数据从 DOUBLE 转换为 DECIMAL

select CAST(TRUNCATE(1234.12346345766,2) as DECIMAL(10,2));
select CAST(ROUND(1234.12346345766,2) as DECIMAL(10,2));
select CAST(TRUNCATE(ROUND(1234.12346345766,2),2) as DECIMAL(10,2));

结果如下

+-----------------------------------------------------+--------------------------------------------------+--------------------------------------------------------------+
| CAST(TRUNCATE(1234.12346345766,2) as DECIMAL(10,2)) | CAST(ROUND(1234.12346345766,2) as DECIMAL(10,2)) | CAST(TRUNCATE(ROUND(1234.12346345766,2),2) as DECIMAL(10,2)) |
+-----------------------------------------------------+--------------------------------------------------+--------------------------------------------------------------+
|                                             1234.12 |                                          1234.12 |                                                      1234.11 |
+-----------------------------------------------------+--------------------------------------------------+--------------------------------------------------------------+

这已经足够接近我想要的了。