最大为3位的圆形双数据类型

oxf4rvwz  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(326)

我试图计算一个代表利率的字段的值,因此我必须将值四舍五入到3位数字。
下面是我正在使用的代码:

double bigAmt1 = Double.parseDouble(amount);
            bigAmt = (intsign*bigAmt1)/div;

        bigAmt=Math.round(bigAmt*1000d)/1000d;

amount = 4048500
intsign = 1
div = 6

它返回=4.048我需要它返回=4.049
如果我将amount的值改为4048600,那么它返回4.049,所以我认为它是对除法后最后一位大于5的值进行四舍五入,但是如果最后一位等于或大于5,那么它应该是对下一位进行四舍五入。
下面是我的测试课--

package test;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(divideAndConvertToString1("4048100","6","1"));
        //System.out.println("---> 3 places  "+Math.round(3.5));
        //Math.round(3.7)
        /*double value = 12.3457652133;
        value =Double.parseDouble(new DecimalFormat("##.####").format(value));
        System.out.println("---> 3 places  "+value);*/
    }

    public static String divideAndConvertToString(String amount, String decml, String sign) {

        double bigAmt = 0.00;

        int div = 0;

        double d =0;

        if (!isStringEmpty(decml)) {
          d = Double.parseDouble(decml);
        }

        double d1 = Math.pow(10, d);
        div = (int)d1;              

        int intsign = Integer.parseInt(sign);

        if (amount != null && !"".equalsIgnoreCase(amount)) {
            //BigDecimal bigAmt1 = new BigDecimal(amount);

            double bigAmt1 = Double.parseDouble(amount);
            bigAmt = (intsign*bigAmt1)/div;         
            bigAmt=Math.ceil(bigAmt*1000d)/1000d;

            //bigAmt = new BigDecimal((intsign*bigAmt1.doubleValue())/div);

            return  String.valueOf(bigAmt);

        }
        else {
            bigAmt = bigAmt;
        }
        System.out.println("inside divideAndConvertToString");
        return String.valueOf(bigAmt);

    }

     public static String divideAndConvertToString1(String amount, String decml, String sign) {

         BigDecimal bigAmt = null;

            int div = 0;

            double d =0;

            if (!Util.isStringEmpty(decml)) {
              d = Double.parseDouble(decml);
            }

            double d1 = Math.pow(10, d);
            div = (int)d1;              

            int intsign = Integer.parseInt(sign);

            if (amount != null && !"".equalsIgnoreCase(amount)) {
                BigDecimal bigAmt1 = new BigDecimal(amount);

                bigAmt = new BigDecimal((intsign*bigAmt1.doubleValue())/div);
            }
            else {
                bigAmt = new BigDecimal("0");
            }
            System.out.println("inside divideAndConvertToString1");

            return String.valueOf(bigAmt.setScale(3, RoundingMode.CEILING));

            //System.out.println(b.setScale(0, RoundingMode.CEILING)); 

        }

     public static boolean isStringEmpty(String input) {
            if (input == null || input.trim().length() == 0 || "".equalsIgnoreCase(input)) {
                return true;
            }
            return false;
        }

}
jm2pwxwz

jm2pwxwz1#

Math.round 我应该像往常一样工作:

bigAmt=Math.floor((bigAmt*1000d)+0.5d)/1000d;

然而,你的问题在别处:

bigAmt1 = Double.parseDouble(amount);
bigAmt = (intsign*bigAmt1)/div;
bigAmt=Math.round(bigAmt*1000d)/1000d;

所以利用你的价值观:

amount = 4048500
intsign = 1
div = 6

bigAmt1 = 4048500;
bigAmt = (1*4048500)/6 = 674750;
bigAmt=   round(674750*1000)/1000 = round(674750000)/1000 = 674750;

但是在你的例子中你写道: it returns = 4.048 I need it return = 4.049 你有同样的吗 div 价值?如果div是 1000000 取而代之的是:

bigAmt1 = 4048500;
bigAmt = (1*4048500)/1000000 = 4.048500;
bigAmt=   round(4.048500*1000)/1000 = round(4048.500)/1000 = 4.049;

然而,有一个大问题,因为浮点可能会四舍五入 4.048500 数字是这样的 4.048499999999 . 直接使用整数舍入更安全:

1000* ((amount+500)/1000)
1000* ((4048500+500)/1000)
1000* ((4049000    )/1000)
1000* (4049)
       4049000

所以你加上一半的舍入值,除以舍入值,然后乘以舍入值。都是整数

k5hmc34c

k5hmc34c2#

你为什么不使用 Math.ceil() ,而不是 Math.round() ,我想这就是为什么。

相关问题