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.0Math.ceil(-3.9) 将是 -4.0

Math.ceil() 向正无穷方向舍入。 Math.floor(3.7) 将是 4.0Math.ceil(-3.9) 将是 -3.0Math.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】:

可以通过RoundingModeBigDecimal来完成:

double roundAway(double value) 
    return new BigDecimal(value).setScale(0, RoundingMode.UP).doubleValue();

注意:这会将double 转换为具有双精度值的BigDecimal。为避免这种情况,您可以使用 BigDecimal.valueOf(double) 而不是使用双精度的规范字符串表示的构造函数,但是由于您要将其四舍五入为整数,这将涉及到不必要的字符串转换。有关详细信息,请参阅constructor documentation。

【讨论】:

以上是关于Java:从零舍入的函数?的主要内容,如果未能解决你的问题,请参考以下文章

1.2浮点数向零舍入

RoundTo()舍入的差异

Python Ctypes,C++ 字符串到浮点数的转换在 python 中调用 Matplotlib 后给出错误/舍入的结果

如何在不自动舍入的情况下在 SQL Server 中返回具有两位小数的数字

如何在不进行任何舍入的情况下将浮点数转换为小数点后 4 位?

区分舍入函数fix/round/ceil/floor