0

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

例如命令

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

返回以下

+------------------------------+---------------------------+---------------------------------------+
| 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 |
+------------------------------+---------------------------+---------------------------------------+

我能做些什么来解决这个问题?

4

1 回答 1

0

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

看起来这是由于值被存储为双精度值而不是十进制值(由于我正在工作的环境的限制,我看不到表模式。)

有效的解决方案是通过将查询包装在 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 |
+-----------------------------------------------------+--------------------------------------------------+--------------------------------------------------------------+

这与我想要的足够接近。

于 2020-03-05T19:29:40.273 回答