MariaDB DOUBLE(10,2) 和 string 之间的比较结果不一致

问题描述 投票:0回答:1

我正在表中搜索

amount
DOUBLE(10,2)
上的完全匹配项。由于我使用的数据库驱动程序,我必须将我的金额绑定为字符串参数。一般来说,这很有效,但这会导致找不到某些值。

例如,比较

3.94
'3.94'
时:

SELECT CAST('3.94' AS DOUBLE(10,2)) = '3.94' `comp`, CAST('3.94' AS DOUBLE(10,2)) `cast`, '3.94' `string`;

数据库认为它们是相同的:

comp  cast  string
   1  3.94    3.94

但是,当比较

7.94
'7.94'
时:

SELECT CAST('4.94' AS DOUBLE(10,2)) = '4.94' `comp`, CAST('4.94' AS DOUBLE(10,2)) `cast`, '4.94' `string`;

数据库认为它们是不同的:

comp  cast  string
   0  4.94    4.94

在这两种情况下,我所显示的内容看起来相同的值,即使它们不匹配。我的假设是某处出现舍入错误,但我不完全理解失败的原因。

我还想知道是否有更好/替代的解决方案来解决这个问题,除了:

SELECT *
FROM `my_amounts_table`
WHERE
`amount` = CAST(:amount AS DECIMAL(10,2));
sql mariadb rounding-error
1个回答
2
投票

DOUBLE(和 FLOAT)无法准确表示大多数值。请改用 DECIMAL,它的设计初衷就是这样做:

SELECT
    CAST('4.94' AS DECIMAL(10,2)) = '4.94' `comp`,
    CAST('4.94' AS DECIMAL(10,2)) `cast`, '4.94' `string`;

您的列类型很可能首先应该是 DECIMAL。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.