如何防止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 JSTLfmt:formatNumber
标签中
【参考方案1】:
当用户输入 2.75 时会返回 3.0
发生这种情况的唯一原因是该值在某些时候被限制为零小数。 Java 仅对 int
(或 long
或 short
或 char
或 byte
)值执行此操作,并且这些值被截断,因此结果将是 2
,而不是 3.0
。
我能想到的唯一 round-to-nearest 是由 数据库 或 JDBC 驱动程序引起的:
数据库中的列类型是INTEGER
或NUMBER(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)?