有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java的数学。函数返回令人困惑的结果

我在学数学。函数,并具有以下代码:

double monthlyRate = (0.7d / 12);
int loanLength = 3;

double powerTest = Math.pow(1.00583, 36);
double powerResult = Math.pow((1 + monthlyRate),(loanLength * 12));

当通过调试器运行时,值将变为

powerTest => 1.2327785029794363
powerResult => 7.698552870922063

第一个是正确的。我已经开始学数学了。在两条分配线上的pow函数。对于powerTest, 数学的参数。战俘们 双a=>;1.00583 双b=>;36.0

对于powerResult,它们是 双a=>;1.0058333333333333 双b=>;36.0

我知道这是机器执行浮点数学的一个问题,我只是不知道如何纠正它。在计算之前,我尝试了以下操作,但结果很差:

monthlyRate = Math.round(monthlyRate * 1000) / 1000;

共 (6) 个答案

  1. # 1 楼答案

    1 + monthlyRate1.0583...,而不是1.00583

  2. # 2 楼答案

    显然,结果(1.23…和7.70)中如此大的差异与浮点数的编码方式无关,但比你在某个地方犯的错误更多 1+0.7/12=1.0583不同于1.00583;-)

  3. # 3 楼答案

    我认为部分问题在于0.7/12 ~ 0.0583331.0583 > 1.00583。我敢打赌,这是你的差异的真正来源,浮点调整与此无关

  4. # 4 楼答案

    在Java上,您可以使用BigDecimal来执行货币操作,从而得到准确的数字:存储货币数字的Sun/Oracle recommended way

    // I'm using Strings for most accuracy
    
    BigDecimal monthlyRate = new BigDecimal("0.7").divide(new BigDecimal(12));
    int loanLength = 3;
    
    BigDecimal powerTest = new BigDecimal("1.00583").pow(36);
    BigDecimal powerResult = BigDecimal.ONE.add(monthlyRate).pow(loanLength * 12);
    
  5. # 5 楼答案

    Math.round(monthlyRate * 1000) / 1000.0;
    

    你用的是整数除法

  6. # 6 楼答案

    表达式0.7d/12=0.0583,在powerTest表达式中使用的是0.00583