Java圆十进制数

时间:2014-03-02 10:12:57

标签: java decimal rounding

我试图获得给定金额的折扣

让我们说:amount =“1.2”和discountPercentage =“17.3”

代码:

orig = Double.parseDouble("amount");
discount = orig*(discountPercentage/100);
discount = Math.round(discount);

discountedprice =  orig - discount;

在上面的代码中:当我使用Math.round(0.2076)绕过折扣时,我得到零(0)结果。

我想要发生的是这样的:

0.2076 =向上舍入时应得到0.21

5 个答案:

答案 0 :(得分:0)

试试这个:

...
discount *= 100;
discount = Math.round(discount);
discount /= 100;
...

答案 1 :(得分:0)

错误:

orig = Double.parseDouble("amount");

不使用变量,而是一个内容为a-m-o-u-n-t的字符串。

String amount = "1.2";
double orig = Double.parseDouble(amount);
double discount = orig*(discountPercentage/100);
discount = Math.round(discount);

但是要注意,double值只能是十进制数的近似值,因为它是2的幂的总和; 0.2为2 -3 ...因此100 * 0.01并不精确等于1.0。

对于财务软件,最好使用BigDecimal,但是它更具有间接性。品尝:

BigBecimal amount = new BigDecimal("1.20"); // Precision of 2 decimals.
BigDecimal discount = amount.multiply(discountPercentage.movePointLeft(2));

答案 2 :(得分:0)

由于

,您的代码将抛出NumberFormatException
orig = Double.parseDouble("amount");

您正在尝试从实际字符串“amount”中解析数字。 如果已经将金额变量初始化,则应使用该变量(删除parseDouble方法中的引号。 E.g。

    String amount = "7.0";
    System.out.println(Double.parseDouble(amount));

您的变量类型也不清楚:discount,discountPercentage,discountedPrice。 根据您在问题中提供的代码,很多内容尚不清楚,因此可能是您问题的一部分。

答案 3 :(得分:0)

请勿使用FloatDouble进行货币计算。使用BigDecimal代替,例如声明herehere

一些代码:

final BigDecimal orig = new BigDecimal(1.2);
final BigDecimal discountPercentage = new BigDecimal(0.173);
final BigDecimal discount = orig.multiply(discountPercentage);
System.out.println("discount = " + discount.setScale(2, BigDecimal.ROUND_HALF_UP));

打印:

  

折扣= 0.21

答案 4 :(得分:-1)

float round(float f,float prec)
{
    return (float) (Math.floor(f*(1.0f/prec) + 0.5)/(1.0f/prec));
}

使用

round(0.2076f,0.01f)

<强>结果

0.21