Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Math.pow奇异结果

Math.pow奇异结果
EN

Stack Overflow用户
提问于 2014-02-02 14:00:09
回答 3查看 538关注 0票数 0

我正在处理一个抵押贷款计算公式,并且得到了与Math.pow()不同的结果,我不知道为什么。

下面是测试设置:

代码语言:javascript
运行
AI代码解释
复制
double interestRatePercent = 7;
double monthlyInterestRate = (interestRatePercent / 100) / MONTHS_PER_YEAR;
int numberOfPayments = loanTermInYears * MONTHS_PER_YEAR;

Log.i(TAG, String.format("monthlyInterestRate: %f", monthlyInterestRate));
Log.i(TAG, String.format("numberOfPayments: %d", numberOfPayments));
Log.i(TAG, "  ");

Log.i(TAG, "Hardcoded result:");
double hardcodedResult = Math.pow(1.0 + 0.005833, numberOfPayments);
Log.i(TAG, String.format("(1 + 0.005833)^360 = %f", hardcodedResult));
Log.i(TAG, "  ");

Log.i(TAG, "Parameterized result:");
double paramResult = Math.pow(1.0 + monthlyInterestRate, numberOfPayments);
Log.i(TAG, String.format("(1 + %f)^%d = %f", monthlyInterestRate, numberOfPayments, paramResult));
Log.i(TAG, "  ");

Log.i(TAG, "BigDecimal result:");
BigDecimal bigResult = BigDecimal.valueOf(1.0 + monthlyInterestRate);
bigResult = bigResult.pow(numberOfPayments);
Log.i(TAG, String.format("(1 + %f)^%d = %f", monthlyInterestRate, numberOfPayments, bigResult));
Log.i(TAG, "  ");
Log.i(TAG, "  ");

以下是测试结果:

代码语言:javascript
运行
AI代码解释
复制
monthlyInterestRate: 0.005833
numberOfPayments: 360

Hardcoded result:
(1 + 0.005833)^360 = 8.115529

Parameterized result:
(1 + 0.005833)^360 = 8.116497

BigDecimal result:
(1 + 0.005833)^360 = 8.116497

只有硬编码的结果是正确的。Math.pow和BigDecimal.pow的结果都很糟糕。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-02 14:08:02

BigDecimal bigResult = BigDecimal.valueOf(1.0 + monthlyInterestRate);

当您创建BigDecimal时,您将失去精度,因为1.0 + monthlyInterestRate将失去精度。要获得更高的精度,请为1.0创建一个BigDecimal,然后使用add()方法将其添加到值为0.005833的另一个BigDecimal中。然后使用BigDecimal pow()函数。

换句话说,从更简单的BigDecimal类型(而不是intdouble类型)构建int

票数 4
EN

Stack Overflow用户

发布于 2014-02-02 14:05:18

7/100/12大约是0.00583333333,而不是0.005833。使用%f时,默认情况下,在小数点之后只看到6位数字。

票数 6
EN

Stack Overflow用户

发布于 2014-02-02 14:19:17

这一差异是由于0.005833333333333333599324266316443754476495087146759033203125,舍入了monthlyInterestRate的实际值,在硬编码结果计算中为0.005833。为了方便起见,我修改了程序以使用System.out.println。我更改了monthlyInterestRate的输出以准确地打印它,然后在硬编码计算中使用该值。产出如下:

代码语言:javascript
运行
AI代码解释
复制
monthlyInterestRate: 0.005833333333333333599324266316443754476495087146759033203125
numberOfPayments: 360

Hardcoded result:
(1 + 0.005833333333333333599324266316443754476495087146759033203125)^360 = 8.116497

Parameterized result:
(1 + 0.005833)^360 = 8.116497

BigDecimal result:
(1 + 0.005833)^360 = 8.116497

以下是修改后的程序:

代码语言:javascript
运行
AI代码解释
复制
import java.math.BigDecimal;

public class Test {
    public static void main(String[] args) {
        double interestRatePercent = 7;
        int MONTHS_PER_YEAR = 12;
        int loanTermInYears = 30;
        double monthlyInterestRate = (interestRatePercent / 100)
                / MONTHS_PER_YEAR;
        int numberOfPayments = loanTermInYears * MONTHS_PER_YEAR;

        // System.out.println(String.format("monthlyInterestRate: %f",
        // monthlyInterestRate));
        System.out.println("monthlyInterestRate: "
                + new BigDecimal(monthlyInterestRate));
        System.out.println(String.format("numberOfPayments: %d",
                numberOfPayments));
        System.out.println("  ");

        System.out.println("Hardcoded result:");
        double hardcodedResult = Math
                .pow(1.0 + 0.005833333333333333599324266316443754476495087146759033203125,
                        numberOfPayments);
        System.out
                .println(String
                        .format("(1 + 0.005833333333333333599324266316443754476495087146759033203125)^360 = %f",
                                hardcodedResult));
        System.out.println("  ");

        System.out.println("Parameterized result:");
        double paramResult = Math.pow(1.0 + monthlyInterestRate,
                numberOfPayments);
        System.out.println(String.format("(1 + %f)^%d = %f",
                monthlyInterestRate, numberOfPayments, paramResult));
        System.out.println("  ");

        System.out.println("BigDecimal result:");
        BigDecimal bigResult = BigDecimal.valueOf(1.0 + monthlyInterestRate);
        bigResult = bigResult.pow(numberOfPayments);
        System.out.println(String.format("(1 + %f)^%d = %f",
                monthlyInterestRate, numberOfPayments, bigResult));
        System.out.println("  ");
        System.out.println("  ");
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21516811

复制
相关文章
Mac OS X下GnuPlot的安装
Gnuplot是一个科学界广泛使用的作图软件,从Unix软件发展而来,是一款免费软件。因为其强大的作图功能,逐渐也有其他行业的人来维护支持这个软件,使其变的越来越流行。
大江小浪
2018/07/25
2.5K0
Mac OS X下GnuPlot的安装
Solr理论基础
传统数据库是为了解决结构化存储而产生的,如关系型数据库、键值存储、操作磁盘文件的map-reduce(映射-规约)引擎,图引擎等。 传统型数据库的缺点:
栋先生
2018/09/29
1.6K0
Solr理论基础
进程理论基础
进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。
全栈程序员站长
2022/07/21
4240
进程理论基础
编码理论基础
,则称 C 为字母表 A 上的一个码。码 C 中的字称为码字。如果码 C 中的码字长度都相同,则称 C 为定长码;否则称其为变长码。如果 ∣A∣=n,则称 C 为 n 元码。
hotarugali
2022/08/30
1.5K0
编码理论基础
收集系统性能数据并通过gnuplot绘图
使用步骤: 1.设置一个定时任何 执行getperf.sh,采集性能数据 2.将采集到性能数据文件,如:192.168.1.1.tar.gz 解压 3.将性能分析的脚步performance_analyse.sh 放到解压后的目录中 4.安装gnuplot程序 5.将字体文件夹,拷贝到/usr/share/fonts/目录 6.直接运行 bash performance_analyse.sh
力哥聊运维与云计算
2019/06/28
1.6K0
利用Apache ab以及GNUPlot来进行Web测试
最近写了几个测试脚本,希望要观察使用PUT方式上传文件和使用POST方式上传文件,两者效率的差别。
大江小浪
2018/07/25
8540
利用Apache ab以及GNUPlot来进行Web测试
Combine理论基础
面向异步数据流的编程思想。业界比较知名的响应式框架是 ReactiveX 系列。Rx 也有 Swift 版本 — RxSwift。
YungFan
2020/02/18
9250
Combine理论基础
线段树理论基础
线段树(segment tree)是一种二叉搜索树,它的每一个结点对应着一个区间[L,R],叶子节点对应的是一个单位区间,即L==R。
用户2965768
2018/08/30
6520
线段树理论基础
iOS理论基础(二)
1.@property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的
编程那点事
2023/02/25
4520
iOS理论基础(二)
树状数组理论基础
  树状数组(binary indexed trees,二进制索引树),最早由Peter M. Fenwick于1994年以“A New Data Structure for Cumulative Frequency Tables"为题发表在SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(cumulative frequency)的计算问题,现多用于高效计算数列的前缀和(∑a[i]).它可以以O(㏒n)的时间得到(∑a[i]),并同样以O(㏒n)的时间执行对某项加一个常数的操作。
用户2965768
2018/08/30
3980
树状数组理论基础
iOS理论基础(一)
a.在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性。
编程那点事
2023/02/25
2620
分布式理论基础
在这一篇中主要讲述分布式基础理论知识,其中包含CAP定理,ACID以,BASE理论以及一致性协议分析.有了CAP定理的基础,能够帮助我们在根据业务特点进行分区容错一致性模型设计中提供解决问题的方向以及架构设计方案的设计与落地实现.同时需要区分数据库ACID的AC与我们的分布式AC存在的联系与差异,其次,在分布式网络中,为避免节点故障抑或是网络延迟等问题导致系统服务出现大量的不可用问题,那么对于BASE理论实现的技术方案有哪些.最后讲述分布式系统中数据的一致性问题.
keithl
2020/06/16
1.8K0
分布式理论基础
浅析HTTPS原理及理论基础
随着互联网高速发展,网络安全也越来越被人重视,而传统的HTTP协议是明文传输,若HTTP请求被骇客截取,就能轻松获取其中内容,存在极大安全隐患。为了解决这个问题,Netscape 公司制定了HTTPS协议,HTTPS可以将数据加密传输,也就是传输的是密文,即便黑客在传输过程中拦截到数据也无法破译,这就保证了网络通信的安全。 际上包含了两次HTTP传输,可以细分为8步:
用户7146828
2021/08/09
3690
​纠删码理论基础
纠删码数据容错原理 纠删码是一种前向纠删码。过程分为编码和解码。编码过程是将文件分割为固定大小的文件块,针对这些被分割的文件块编码为k个块(k个块中包括了k1个数据块和k2个校验块)。解码过程是将编码后的多个子块作为输入,经过解码可以恢复任何一个块的数据(不管是数据块还是校验块)。 采用纠删码技术来做数据容错,当磁盘出现故障,失效数据可以通过纠删码的校验链的构建机制来恢复数据,而不是纠正数据自身的错误,一般(k+r,k)纠删码存储开校门为r/k,相对副本纠删码具有低存储开销,但是纠删码涉及到的编解码
用户4700054
2022/08/17
1.4K0
​纠删码理论基础
面向对象编程理论基础
热爱探索的星际流浪者西夏普某天,开着他的小破宇宙飞船来到了一个无名星球,像往常登陆某个星球一样,他准备先围绕星球环行一周再着陆。就当他环行到一半的时候,突然飞船探测到此星球有一处上古遗迹,西夏普大喜过望,立马向那处遗迹飞去。
宿春磊Charles
2023/09/08
1650
分布式事务理论基础
在我们以前所学习的单体架构当中的这个服务直接访问一个数据库,业务比较简单。基于数据库本身的特性,就已经能够实现ACID了。
叫我阿杰好了
2023/10/17
2240
分布式事务理论基础
WebRTC:理论基础、行业地位、网络架构
目录: 媲美zoom的视频会议app WebRTC的行业地位 RTC架构 动态分辨率调整 ---- 媲美zoom的视频会议app 上一期《WebRTC安全问题:私有IP与mDNS》中介绍了私有IP
Jean
2020/10/28
8130
WebRTC:理论基础、行业地位、网络架构
机器学习(十六) ——SVM理论基础
机器学习(十六)——SVM理论基础 (原创内容,转载请注明来源,谢谢) 一、概述 支持向量机(supportvector machine,SVM),是一种分类算法,也是属于监督学习的一种。其原理和l
用户1327360
2018/03/07
8630
机器学习(十六) ——SVM理论基础
用libsvm进行回归预测
作者:kongmeng http://www.cnblogs.com/hdu-2010/p 最近因工作需要,学习了台湾大学林智仁(Lin Chih-Jen)教授 http://www.ie.ntu.edu.tw/professors/%E5%90%88%E8%81%98%E5%B0%88%E4%BB%BB%E5%B8%AB%E8%B3%87/cjlin/ 等人开发的SVM算法开源算法包。 为了以后方便查阅,特把环境配置及参数设置等方面的信息记录下来。 SVM属于十大挖掘算法之一,主要用于分类和回归。本文
机器学习AI算法工程
2018/03/14
2.5K0
用libsvm进行回归预测
点击加载更多

相似问题

蜂窝塔位置

11

从蜂窝塔数据库获取位置

11

使用wifi或蜂窝塔信号获取位置更新。

21

使用蜂窝塔的Android定位

12

获取手机塔位置- Android

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档