Java:从零舍入的函数?
Posted
技术标签:
【中文标题】Java:从零舍入的函数?【英文标题】:Java: function to round away from zero? 【发布时间】:2020-04-23 14:58:31 【问题描述】:如何在 Java 中从零开始舍入一个双精度数?
我知道的操作不符合我的要求:
将其转换为 (int)
会将其舍入为零。 (int) 3.7
将是 3
,
(int) - 3.9
将是 -3
。
Math.floor()
向负无穷大舍入。 Math.ceil(3.7)
将是 3.0
,Math.ceil(-3.9)
将是 -4.0
。
Math.ceil()
向正无穷方向舍入。 Math.floor(3.7)
将是 4.0
,Math.ceil(-3.9)
将是 -3.0
。
Math.round()
向最接近的整数舍入。
但是我没有从零四舍五入的东西,例如 3.7
变成 4.0
,-3.9
变成 -4.0
。
Java中有这样的功能吗?
【问题讨论】:
问得好,研究和例子很好。 在您的示例中,地板指的是 ceil,而 ceil 指的是地板。 【参考方案1】:检查号码的符号:
double roundedAway = (num >= 0) ? Math.ceil(num) : Math.floor(num)
【讨论】:
【参考方案2】:您可以根据您的数字是正数还是负数来实现自己的函数,也可以使用RoundingMode。它可以使用UP 显式地从零舍入
它可能看起来像这样
DecimalFormat df = new DecimalFormat("#.#");
df.setRoundingMode(RoundingMode.UP);
System.out.println(df.format(number_here));
【讨论】:
这会将双精度转换为String
,而不是将其保留为双精度。如果这就是双重发生的事情,那很好;但否则你必须从字符串中解析回来。【参考方案3】:
可以通过RoundingMode
和BigDecimal
来完成:
double roundAway(double value)
return new BigDecimal(value).setScale(0, RoundingMode.UP).doubleValue();
注意:这会将double
转换为具有双精度值的BigDecimal
。为避免这种情况,您可以使用 BigDecimal.valueOf(double)
而不是使用双精度的规范字符串表示的构造函数,但是由于您要将其四舍五入为整数,这将涉及到不必要的字符串转换。有关详细信息,请参阅constructor documentation。
【讨论】:
以上是关于Java:从零舍入的函数?的主要内容,如果未能解决你的问题,请参考以下文章
Python Ctypes,C++ 字符串到浮点数的转换在 python 中调用 Matplotlib 后给出错误/舍入的结果
如何在不自动舍入的情况下在 SQL Server 中返回具有两位小数的数字