我搜索了互联网,但没有找到任何解决方案。
我希望能够使用相同/复制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,但我可能错过了正确的功能。
非常感谢
答案 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);
即。 1024
和100
提供10.24
- &gt; 10
- &gt; 1000
。