java中"(double)(Math.round(x3 * 10000))/10000"为啥这个东西会输出小数啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中"(double)(Math.round(x3 * 10000))/10000"为啥这个东西会输出小数啊?相关的知识,希望对你有一定的参考价值。

\"(double)(Math.round(x3 * 10000))/10000\"为什么这个东西会输出小数啊?不是Math.round返回的是long类型的吗?即使long类型的变量被强制转换成了double类型,那还应该是长整型啊。

double是双精度类型在你/10000之前已经被强转 再后面的操作只要不再转换它将一只是double 也就是双精度的带小数点的结果 参考技术A 你产生一个随机数把它放大10000倍 然后又缩小10000倍 参考技术B 你都说了转换了,怎么还是long类型呢....

Java# Java中double保留小数位的方法

需求:将 double 的结果保留2位小数

返回结果是 double 的:

  • 四舍五入

    double d = 123.456;
    d = (double) Math.round(d * 100) / 100;
    
  • 其他形式

    double d = 123.455;
    BigDecimal b = new BigDecimal(d+"");  // 直接传入 float或 double,会损失精度
    d = b.setScale(2, BigDeclimal.ROUND_HALF_UP).doubleValue();  // 123.46
    // ROUND_HALF_UP  四舍五入
    // ROUND_HALF_DOWN  五舍六入     123.45
    // ROUND_UP  直接进位            123.46
    // ROUND_DOWN  直接丢弃末尾       123.45
    

返回结果是 String 的:

  • #.00 保留后两位,后面的直接舍弃

    double d = 123.455;
    DecimalFormat df = new DecimalFormat("#.00");
    String str = df.format(d);  // 123.45
    
  • %.2f 保留后两位,四舍五入

    double d = 123.456;
    String.format("%.2f", d);  // 123.46
    
  • RoundingMode.HALF_DOWN 五舍六入,负数先取绝对值,再五舍六入,然后再变为负数

    RoundingMode.HALF_UP 四舍五入,负数先取绝对值,再四舍五入,然后再变为负数

    double d = 123.456;
    NumberFormat nf = NumberFormat.getNumberInstance();
    // 保留两位小数
    nf.setRoundingMode(RoundingMode.UP);
    

以上是关于java中"(double)(Math.round(x3 * 10000))/10000"为啥这个东西会输出小数啊?的主要内容,如果未能解决你的问题,请参考以下文章

java、怎样简便的保留小数点后两位。

Java 理解 Math.getExponent(Double)

Java-Math类

java中用Math.random()产生的随机数包括0和1吗

java程序中Math.random();的取值范围是多少?(是0到1double型吗?)

java-Math类