如何在Java中乘以LONG和FLOAT

我需要将两个数字相乘(例如,AB)并返回结果(A*B)。

健康)状况:

number A : 0Long.MAX_VALUE之间的任何数字(即 0 <= A <= 9,223,372,036,854,775,807)

number B : 010000.0000000000之间的任何数字) // 记住 'B' 将是一个十进制数,最多有 10 个小数位

如果 ( A * B )的结果包含小数,则向上舍入到下一个更高的整数。例如,

  1. 如果 A x B 的结果 = 10.1 => 11
  2. 如果 A x B 的结果 = 10.5 => 11
  3. 如果 A x B 的结果 = 10.9 => 11
  4. 如果 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


以上是如何在Java中乘以LONG和FLOAT的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>