【问题标题】:Can you replicate the Floor function found in Excel in Java?你能用 Java 复制 Excel 中的 Floor 函数吗?
【发布时间】:2014-08-14 09:35:05
【问题描述】:

我已经搜索了互联网,但没有找到任何解决我的问题的方法。

我希望能够使用/复制在 Java 中的 Excel 中找到的相同类型的 FLOOR 函数。特别是我希望能够提供一个值(double 或最好是 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,但我可能错过了正确的功能。

非常感谢

【问题讨论】:

    标签: java excel math bigdecimal rounding


    【解决方案1】:

    是的,你可以。

    假设给定的数字是

    76.21445 和

    0.01

    您可以做的是将 76.21445 乘以 100(或除以 0.01) 将结果四舍五入到最接近或较小的整数(取决于您想要的)

    然后再乘以这个数字。

    请注意,如果您不使用小数精度的数字,它可能无法准确打印您想要的内容。 (二进制格式的数字在扩展上不是有限的问题)。同样在 Math 中,你可以使用 round 函数来做你想做的事情。

    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;
    }
    

    【讨论】:

    • 谢谢,太好了。我将 BigDecimal 应用于上述逻辑并得到了我想要的。
    • 我发现 ruby​​ 的小数精度有问题,所以我使用了以下表达式:(number * (1/precision)).floor * precision 而不是 (number / precision).floor * precision 来避免它。
    • 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;}
    【解决方案2】:

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

    现在您需要确定“重要性”的位数。为此使用Math.log10(significance)。您可能需要将结果四舍五入。

    如果结果是否定的,那么你有一个setScale(-result, RoundingMode.FLOOR)四舍五入到N位。

    如果 > 1,则使用以下代码:

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

    1024100 给出 10.24 -> 10 -> 1000

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2011-09-22
      • 2011-05-31
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2019-05-15
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多