Java中如何乘法长和浮点

Java中如何乘法长和浮点,java,Java,我需要将两个数字相乘(例如,A和B)并返回结果(A*B) 条件: 数字A:介于0到之间的任意数字。最大值(即0.11 如果x B=10.9=>11的结果 如果x B>的结果=LONG_MAX,则返回LONG_MAX(即9223372036854775807) 我写了一个简单的函数,但它给了我奇怪的结果!!你能纠正我为什么函数失败吗 static long multiply(long A, float B) { long result = (long) Math.ceil(A * B);

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

条件:

数字A:介于0之间的任意数字。最大值(即0.11
  • 如果x B=10.9=>11的结果
  • 如果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个测试用例失败。请告诉我如何更正它


    谢谢。

    使用BigDecimal以几乎无限范围的十进制数制进行计算和四舍五入:

    static long multiply(long A, float B)
    {
        return new BigDecimal(A)
               .multiply(new BigDecimal(B))
               .max(new BigDecimal(Long.MAX_VALUE)
               .setScale(0, RoundingMode.UP)
               .longValue();
    }
    

    使用BigDecimal在几乎无限范围的十进制数字系统中进行计算和四舍五入:

    static long multiply(long A, float B)
    {
        return new BigDecimal(A)
               .multiply(new BigDecimal(B))
               .max(new BigDecimal(Long.MAX_VALUE)
               .setScale(0, RoundingMode.UP)
               .longValue();
    }
    
    首先,如果“B”是一个小数位数最多为10位的十进制数,那么它需要是一个
    双精度
    ,而不是
    浮点数

    为了防止计算过程中的精度损失,需要使用
    BigDecimal

    静态长乘法(长a,双b){
    if(a<0 | | b<0)
    抛出新的IllegalArgumentException(“不允许负值”);
    BigDecimal结果=BigDecimal.valueOf(a)
    .multiply(BigDecimal.valueOf(b))
    .setScale(0,舍入模式向上);
    返回(result.compareTo(BigDecimal.valueOf(Long.MAX_VALUE))<0
    ?result.longValue():Long.MAX_值);
    }
    
    试验

    System.out.println(乘法(10L,1.11));//12
    System.out.println(乘法(10L,1.17));//12
    System.out.println(乘法(Long.MAX_值,1.11));//9223372036854775807
    System.out.println(乘法(9999999L,9.9999));//9998991
    System.out.println(乘法(4611686018427387908L,1.0));//4611686018427387908
    System.out.println(乘法(96113850L,1.0));//96113850
    
    首先,如果“'B'将是一个小数点后最多10位的十进制数”,那么它需要是一个
    双精度的
    ,而不是
    浮点数

    为了防止计算过程中的精度损失,需要使用
    BigDecimal

    静态长乘法(长a,双b){
    if(a<0 | | b<0)
    抛出新的IllegalArgumentException(“不允许负值”);
    BigDecimal结果=BigDecimal.valueOf(a)
    .multiply(BigDecimal.valueOf(b))
    .setScale(0,舍入模式向上);
    返回(result.compareTo(BigDecimal.valueOf(Long.MAX_VALUE))<0
    ?result.longValue():Long.MAX_值);
    }
    
    试验

    System.out.println(乘法(10L,1.11));//12
    System.out.println(乘法(10L,1.17));//12
    System.out.println(乘法(Long.MAX_值,1.11));//9223372036854775807
    System.out.println(乘法(9999999L,9.9999));//9998991
    System.out.println(乘法(4611686018427387908L,1.0));//4611686018427387908
    System.out.println(乘法(96113850L,1.0));//96113850
    
    你能用double而不是float吗?是的,我可以用double来表示数字“B”。float几乎从来都不是答案。double更精确。你可能必须使用BigDecimal。double不太精确,但更精确。float更精确,但不太准确。有一个关键的区别需要注意,值得花时间去理解它。@RichardBarker
    double
    有53位精度,
    float
    只有24位精度,所以
    double
    肯定比
    float
    更精确。它也更精确。你能用double而不是float吗?是的,我可以用double来表示数字“B”。float几乎从来都不是答案。double更精确。你可以我们不必使用BigDecimal。Double不太精确,但更精确。float更精确,但不太精确。有一个关键的区别需要注意,值得花时间去理解它。@RichardBarker
    Double
    有53位精度,
    float
    只有24位精度,所以
    Double
    肯定更精确ecise比
    float
    更准确。谢谢@andreastank@Andreas