如何在Java中乘以LONG和FLOAT
我需要将两个数字相乘(例如,A和B)并返回结果(A*B)。
健康)状况:
number A : 0到Long.MAX_VALUE之间的任何数字(即 0 <= A <= 9,223,372,036,854,775,807)
number B : 0到10000.0000000000之间的任何数字) // 记住 'B' 将是一个十进制数,最多有 10 个小数位
如果 ( A * B )的结果包含小数,则向上舍入到下一个更高的整数。例如,
- 如果 A x B 的结果 = 10.1 => 11
- 如果 A x B 的结果 = 10.5 => 11
- 如果 A x B 的结果 = 10.9 => 11
- 如果 A x B 的结果 >= LONG_MAX,则返回 LONG_MAX(即 9223372036854775807)
我写了一个简单的函数,但它给了我奇怪的结果!!你能纠正我为什么功能失败吗?
static long multiply(long A, float B)
{
long result = (long) Math.ceil(A * B);
return result;
}
public static void main(String args[])
{
System.out.println(multiply(10L, 1.11F)); // 10 x 1.11 => 11.1 => 12 [PASS]
System.out.println(multiply(10L, 1.17F)); //10 x 1.17 => 11.7 => 12 [PASS]
System.out.println(multiply(Long.MAX_VALUE, 1.11F)); // 9223372036854775807 x 1.11 => 9223372036854775807 [PASS]
System.out.println(multiply(9999999L, 9.9999F)); // 9999999 x 9.9999 => 99,998,990.0001 => 99,998,991 [FAIL]
// I am getting 99998992, instead of 99998991 !!
System.out.println(multiply(4611686018427387908L, 1.0F)); // 4611686018427387908L x 1 => 4611686018427387908 [FAIL]
// I am getting 4611686018427387904 instead of 4611686018427387908
System.out.println(multiply(96113850L, 1.0F)); // 96113850 x 1 => 96113850 [FAIL]
// I am getting 96113848 instead of 96113850
}
最后 3 个测试用例失败。请让我知道如何纠正它?
谢谢你。
回答
首先,如果“'B' 将是一个最多有 10 个小数位的十进制数”,那么它需要是 a double,而不是 a float。
为防止计算过程中精度损失,需要使用BigDecimal.
static long multiply(long a, double b) {
if (a < 0 || b < 0)
throw new IllegalArgumentException("Negative value not allowed");
BigDecimal result = BigDecimal.valueOf(a)
.multiply(BigDecimal.valueOf(b))
.setScale(0, RoundingMode.UP);
return (result.compareTo(BigDecimal.valueOf(Long.MAX_VALUE)) < 0
? result.longValue() : Long.MAX_VALUE);
}
测试
System.out.println(multiply(10L, 1.11)); // 12
System.out.println(multiply(10L, 1.17)); // 12
System.out.println(multiply(Long.MAX_VALUE, 1.11)); // 9223372036854775807
System.out.println(multiply(9999999L, 9.9999)); // 99998991
System.out.println(multiply(4611686018427387908L, 1.0)); // 4611686018427387908
System.out.println(multiply(96113850L, 1.0)); // 96113850