Java和SQL Server中的精确噩梦

Dan*_*iil 4 java sql-server precision rounding

我一直在努力解决Java和SQL Server中的精确噩梦,直到​​我不知道为止.就个人而言,我理解这个问题及其根本原因,但向全球客户解释这一点是不可行的(至少对我而言).

情况就是这样.我在SQL Server中有两列--Qty INT和Price FLOAT.这些值为 - 1250和10.8601 - 因此,为了获得总值,其数量*价格和结果为13575.124999999998(在Java和SQL Server中).那是对的.问题是这个 - 客户不想看到它,他们只看到这个数字为13575.125就是这样.在一个地方,他们可以用2位小数精度看到它,另外4位小数.当以4位小数显示时,数字是正确的 - 13575.125,但是当以2位小数显示时,他们认为它是错误的 - 13575.12 - 应该是13575.13!

救命.

Yis*_*hai 12

你的问题是你正在使用浮动.在java方面,你需要使用BigDecimal,而不是float或double,在SQL方面你需要使用Decimal(19,4)(如果它有助于跳转到你的精度级别,则使用Decimal(19,3)).不要使用Money类型,因为SQL中的Money类型的数学会导致截断,而不是舍入.数据存储为float类型(你说它是不可更改的)的事实不会影响这一点,你只需要在第一次机会之前转换它,然后再对它进行数学运算.

在您给出的具体示例中,您需要首先获取4位小数精度数,并根据具体情况将其置于BigDecimal或Decimal(19,4)中,然后进一步将其舍入为2位小数精度.然后(如果你正在四舍五入)你将得到你想要的结果.


Tho*_*ung 5

使用BigDecimal.Float不是代表金钱的代理类型.它将正确处理舍入.Float将始终产生舍入误差.