java中的不同结果如何纠正

java中的不同结果如何纠正,java,math,Java,Math,在java中,简单的计算会给出不同的结果 int a=5363/12*5; out.println(a);// result is 2230 但实际结果应该是2234.5 如何纠正这个java结果 将a作为双精度 将a作为int将其四舍五入为整数。两个问题: 表达式5363/12*5给出一个整数结果(特别是除法是整数) 变量a的类型为int(整数) 要修复: double a=5363.0/12*5; out.println(a); 请注意,一般来说,在使用浮点运算时,您不能期望得到精确

在java中,简单的计算会给出不同的结果

int a=5363/12*5;

out.println(a);// result is 2230 
但实际结果应该是
2234.5


如何纠正这个java结果

a
作为双精度

将a作为int将其四舍五入为整数。

两个问题:

  • 表达式
    5363/12*5
    给出一个整数结果(特别是除法是整数)
  • 变量
    a
    的类型为
    int
    (整数)
  • 要修复:

    double a=5363.0/12*5;
    out.println(a);
    

    请注意,一般来说,在使用浮点运算时,您不能期望得到精确的结果。下面是一个很好的解读:.

    一个
    int
    是一个整数-在
    之后没有任何内容

    你应该使用

    double a = 5363d/12*5;
    

    5363、12和5都被解释为int。此处实际执行的计算是:

    5363/12 = 446.9… - truncated to the int value 446
    446 * 5 = 2230
    
    尝试将a指定为浮点数,并指示计算中的数字也创建为浮点数:

    float a = 5363f/12f*5f
    

    它似乎有一些整数/双舍入问题:

    double a=((double)5363/12)*5;
    System.out.println("VALUE: "+a);
    
    印刷品:

    价值:2234.5833335

    编辑:将结果四舍五入为整数值:

    double a=((double)5363/12)*5;
    long b=Math.round(a); //you can cast it to an int type if needed
    System.out.println("ROUNDED: "+b);
    
    印刷品:

    四舍五入:2235


    因为右边的所有文字数字都是整数(例如5363而不是5363.0),所以表达式是使用整数算术语义计算的,即
    /
    进行整数除法。因此,5262/12等于446,446*5等于2230。另外,变量
    a
    是一个
    int
    ,它只能保存一个整数值

    要解决这个问题,你需要做两件事。将
    a
    的类型更改为十进制类型,例如
    float
    double
    b)将5363和12中的至少一个表示为十进制类型,例如

    double a= 5363.0/12.0*5
    
    使用双重 双a=5363/12*5; 系统输出打印项次(a)

    或 强制转换整数,以防止丢失或精确

    INTA=((int)5363/12*5);
    系统输出打印项次(a)

    您可以对表达式重新排序,而不是使用double

    假设5363/12*5=5363*5/12,这将为您提供更接近的答案。您已注释希望对结果进行四舍五入,因此必须将要除以的值加上一半

    int a = (5363 * 5 + /* for rounding */ 6) / 12;
    System.out.println(a);
    
    印刷品

    2235
    

    结果是2230.0,但应该是2234.5整数不是实数。双人和浮球都是。使用正确的数据类型。@mcfinnigan为什么其他人反对我的问题,他们的问题是什么?通过否决投票,他们想证明他们有权否决Votegive下面的答案,也可以将David Goldberg的论文链接起来@麦克芬尼根:双精度和浮点数不是实数——它们是浮点数。是的,我是学究,但一个人需要在这个领域。@HighPerformanceMark理所当然,我不够学究=)谢谢它是作为2234.5833335来的,但是如何将它限制到2235?要获得解决方案而不使用
    double
    round
    ,看我的答案。是的,结果是2234.5833335,但应该是2234。5@tom不,不应该,你不能改变数学!有人否决了你的答案,你能把它四舍五入,使它成为2235吗?@Marcelo是的,我知道我不能改变数学,这就是为什么你否决了我的问题,对吗?@tom
    5363d
    告诉编译器将值
    5363
    视为
    double
    ,不是正常情况下的
    int
    。是的,我以任何方式投票支持你的答案,你能投票支持我的问题吗