java - Java 和 SQL Server 中的精度噩梦

标签 java sql-server rounding precision

我一直在为 Java 和 SQL Server 中的精度梦魇而苦苦挣扎,直到我再也不知道了。就我个人而言,我理解这个问题及其根本原因,但向地球另一端的客户解释这一点是不可行的(至少对我而言)。

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

帮助。

最佳答案

您的问题是您使用的是 float 。在 Java 端,您需要使用 BigDecimal,而不是 float 或 double,而在 SQL 端,您需要使用 Decimal(19,4)(或者 Decimal(19,3),如果它有助于跳转到您的精度级别)。不要使用 Money 类型,因为 SQL 中 Money 类型的数学会导致截断,而不是舍入。数据存储为 float 类型(你说它是不可更改的)这一事实并不影响这一点,你只需要在对它进行数学运算之前第一时间转换它。

在你给出的具体例子中,你需要先得到4位小数精度的数字,视情况放入BigDecimal或Decimal(19,4)中,然后进一步四舍五入到2位小数精度。然后(如果你正在四舍五入)你会得到你想要的结果。

关于java - Java 和 SQL Server 中的精度噩梦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750139/

相关文章:

java - 尝试使用 actionListener 将字符串颠倒过来

java - 什么是 JAXBContext.newInstance(String contextPath)?

SQL舍入功能

java - 将 BigDecimal 舍入到最接近的 5 美分

c - 小数点后N位C四舍五入

java - 使用 Java Stream API 进行多级分组和求和

java - 如何使用 Spring Boot 应用程序初始化 log4j?

SQL 来确定连续访问天数的不同时期?

sql-server - .dwproj 无法打开,因为此版本的应用程序不支持其项目类型 (.dwproj)

sql - T-SQL 返回结果并继续处理