如何防止Java自动舍入

Posted

技术标签:

【中文标题】如何防止Java自动舍入【英文标题】:How to prevent Java from auto rounding up 【发布时间】:2020-06-06 19:02:09 【问题描述】:

我有一个返回双精度的方法

public double getOdds() 
    return odds;

这完全没问题。但是,问题是在显示数据时,它会自动将插入的值向上舍入。我想防止这一点,并得到一个小数点后 2 位的值。

这是我调用该方法的 JSP。 ArrayList“赌注”由用户输入的所有值组成。但是,如上所述,当用户输入 2.75 时,它将返回 3.0

ArrayList <bets> bets = betsDAO.getBets(x, y);

for (bets bet : bets) 

    <td><%=bet.getOdds()%></td>

我还是 Java 新手,并尝试寻找解决方案,但不幸的是我无法解决问题。

【问题讨论】:

我没有时间打出完整的答案,但您想要的可能在 JSP JSTL fmt:formatNumber 标签中 【参考方案1】:

当用户输入 2.75 时会返回 3.0

发生这种情况的唯一原因是该值在某些时候被限制为零小数。 Java 仅对 int(或 longshortcharbyte)值执行此操作,并且这些值被截断,因此结果将是 2,而不是 3.0

我能想到的唯一 round-to-nearest 是由 数据库 或 JDBC 驱动程序引起的:

数据库中的列类型是INTEGERNUMBER(5,0) 或类似的东西。检查您的数据库架构。

读取数据库的代码 (betsDAO) 正在调用 getInt(...),JDBC 驱动程序会为您舍入该值。

无论如何,错误出在你没有显示的代码中。

【讨论】:

非常感谢。非常有帮助的答案。您的两个“预测”都是正确的。我的数据库中的列设置为 INTEGER,并且 betsDAO 使用了 getInt()。我已将两个实例都更改为 Double 并且我的代码现在可以正常工作。非常感谢! @tobiasmadsen17 仅供参考:“赌注”听起来像是一个美元金额,您不应该使用double 来表示货币价值,而是使用BigDecimal,并且数据库中的NUMBER(15, 2)(将15 替换为您选择的大小)。 --- Why not use Double or Float to represent currency?【参考方案2】:

这取决于您打算使用哪种数据类型,但是这个

should do the trick for you

    public class Rounding 

        public static void main(String[] args) 
             //using string format
            double input = 3.14159265359;
            System.out.println("double : " + input);
            System.out.println("double : " + String.format("%.2f", input));

//using Decimal format
     double num = 1.34567;
        DecimalFormat df = new DecimalFormat("#.###");
        df.setRoundingMode(RoundingMode.CEILING);

        System.out.println(df.format(num));
        

    

输出: 双倍:3.14159265359 双倍:3.14 双倍:3.14

输出: 1.346

所以你可以在这里更具体地返回小数点。这一切都取决于小数精度对您的项目的重要性

【讨论】:

那么问题是如果 get 的值是例如3.0,因为它会在用户输入数字时自动四舍五入。所以当我输入 2.75 时,我会得到 3.0 的输出。 @tobiasmadsen17 发生这种情况是因为用于该值的数据类型。如果您使用 int 类型作为值并且用户输入 2.7,它会将值四舍五入到最接近的整数值,您应该使用 double 来获取十进制值 我用过这个:“数字”有替代品吗? 你应该在这种情况下使用文本 获取输入的实际十进制数并解析该数字到后端函数的小数类型 @Buchi "如果您使用 int 类型作为值并且用户输入 2.7,它会将值四舍五入到最接近的整数值" --- 错误。将double 转换为int 会将值截断2,而不是四舍五入。【参考方案3】:

Math.floor 不能帮助四舍五入吗?它向下取整,如果您需要向上取整,请使用 Math.ceil。 希望这会有所帮助!

【讨论】:

很遗憾没有。我想显示 2 位小数。用户输入的小数。

以上是关于如何防止Java自动舍入的主要内容,如果未能解决你的问题,请参考以下文章

防止 ActiveRecord 舍入小的数字属性 (< 1e-20)?

有没有办法防止opencv矩阵除法中的舍入

Java / Swing:JScrollPane中的JTextArea,如何防止自动滚动?

这种精度损失发生在哪里以及如何防止它?

PostgreSQL如何防止表太大?

ThinkPHP如何防止SQL注入?