你能复制在Java中的Excel中找到的Floor功能吗?

时间:2014-08-14 09:35:05

标签: java excel math bigdecimal rounding

我搜索了互联网,但没有找到任何解决方案。

我希望能够使用相同/复制Java中的Excel中的FLOOR函数类型。特别是我希望能够提供一个值(双倍或最好是BigDecimal)并向下舍入到我提供的最接近的倍数。

Examples 1:
Value = 24,519.30235
Significance = 0.01
Returned Value = 24,519.30

Example 2:
Value = 76.81485697
Significance = 1
Returned Value = 76

Example 3:
Value = 12,457,854
Significance = 100
Returned Value = 12,457,800

我对java很新,并且想知道是否有人知道API是否已经包含该功能,或者他们是否愿意为我提供上述解决方案。我知道BigDecimal,但我可能错过了正确的功能。

非常感谢

2 个答案:

答案 0 :(得分:2)

是的,你可以。

让我们说给定的数字是

76.21445 和

0.01

你可以做的是将76.21445乘以100(或每0.01除以) 将结果四舍五入到最接近或更低的整数(取决于你想要的那个)

然后再将它乘以数字。

请注意,如果您不使用小数精度的数字,它可能无法准确打印您想要的内容。 (二进制格式的数字问题在扩展中不是有限的)。同样在数学中,您可以使用圆形函数来完成您想要的任务。

http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html你就像这样使用它

round(200.3456, 2);

一个示例代码可以是

public static void main(String[] args) {
    BigDecimal value = new BigDecimal("2.0");
    BigDecimal significance = new BigDecimal("0.5");
    for (int i = 1; i <= 10; i++) {
        System.out.println(value + " --> " + floor(value, significance));
        value = value.add(new BigDecimal("0.1"));
    }
}

private static double floor(BigDecimal value, BigDecimal significance) {
    double result = 0;
    if (value != null) {
        result = value.divide(significance).doubleValue();
        result = Math.floor(result) * significance.doubleValue();
    }
    return result;
}

答案 1 :(得分:0)

要对BigDecimal进行舍入,您可以使用setScale()。在您的情况下,您需要RoundingMode.FLOOR

现在您需要确定&#34;显着性&#34;的位数。请使用Math.log10(significance)。你可能不得不将结果四舍五入。

如果结果是否定的,那么你有一个重要性&lt; 1.在这种情况下,使用setScale(-result, RoundingMode.FLOOR)舍入到N位数。

如果它&gt; 1,然后使用此代码:

 value
.divide(significance)
.setScale(0, RoundingMode.FLOOR)
.multiply(significance);

即。 1024100提供10.24 - &gt; 10 - &gt; 1000