2 kai 12 kai_12 于 2017.09.03 16:46 提问

java中关于浮点数值不适用于禁止出现舍入误差的金融计算中的问题

System.out.println(2.0-1.1);结果输出0.8999999999999999,而不是0.9,书上说,因为浮点数值采用二进制系统表示,所有没法精确到表示分数1/10,但是当我把2.0换成3.0时,输出的结果则是1.9。我有点想不通原因,请大家指教,谢谢!

3个回答

Small_Mouse0
Small_Mouse0   Rxr 2017.09.03 17:09
已采纳

借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。

参考链接:http://blog.csdn.net/jackiehff/article/details/8582449

【为什么浮点计算不准确】参考这篇博客:http://blog.csdn.net/superherowupan/article/details/51315020
kai_12
kai_12 谢谢
11 个月之前 回复
caozhy
caozhy   Ds   Rxr 2017.09.03 17:08

假设有一种三进制算法,那么1/3就是 0.1 2/3就是0.2 1就是1,对吧。
但是转换成十进制,1/3就是0.3333333333333。没办法精确表示
二进制也是一样,比如十进制的0.1,用二进制就只能表示为一个无限小数。

kai_12
kai_12 非常感谢
11 个月之前 回复
qq_27603059
qq_27603059   2017.09.03 23:49

float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
金融、支付行业的开发者不得不知道的float、double计算误差问题
在大多数行业涉及到浮点数的计算的场景比较少,但是在金融、支付行业就比较多了,而且在这两个行业一个小小的错误 可能将会给公司带来极大的损失。 在浮点运算中,浮点运算很少是精确的。虽然一些数字(譬如 0.5 )可以精确地表示为二进制(底数 2)小数(因为 0.5 等于 2 -1),但其它一些数字(譬如 0.1 )就不能精确的表示。因此,浮点运算可能导致舍入误差,产生的结果接近但不等于你 可能希望的结果。
js数字舍入误差以及解决方法
1、起因: 返回结果是true。 2、原因:计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。 3、解决方法 (1)toFixed(),存在兼容性(chrome) (2)比较
Java浮点数float和double精确计算的精度误差问题总结
1、float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。 原因:超出float精度范围,无法精确计算。 float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。 float:2^23 = 8388608,一共七位,这意味
计算方法实习题一 舍入误差与数值稳定性(C语言)
实验目的 (1) 通过上机编程,复习巩固以前所学程序设计语言及上机操作指令。 (2) 通过上机计算,了解舍入误差所引起的数值不稳定性。 实验内容 用两种不同的顺序计算 ,分析其误差的变化。 实验步骤 用两种不同的顺序计算,即从n=1加到n=10000和从n=10000加到n=1。 程序设计 #include<stdio.h> #include<math.h&gt...
金融类app各种数值的精确计算问题
金融类app货币单位精确计算问题
金融项目java开发_BigDecimal(解决计算精度问题)
当使用double进行商业运算时,double计算会丢失精度。可以使用BigDecimal进行计算。 import java.math.BigDecimal; import org.junit.Test; public class TestBigDecimal{ @Test public void test(){ double a=0.1; double b=0.
关于金融的一些工具包整理
量化工具包的整理。excel,matlab,python,R,……
java金融货币处理
转自:http://imtinx.iteye.com/blog/832325 在《你可能不知道的Java基础知识(一)》中,我提到使用浮点运算要慎重,感觉说的不够透彻,其实float和double类型主要是为科学和工程计算而设计的。他们执行的是二进制浮点运算,由于二进制的局限性,有时候无法得到准确的结果。  例如:System.out.println(2.0-1.1)将输出0.899999
java 浮点数值计算误差
问题 当我们运行如下函数时 public void test() { System.out.println(2.0-1.1); //=>0.8999999999999999 } 我们发现其结果并非是我们预想的0.9 原因 其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确表示1/10。这就好像十进制无法精确表示1/3一样。如果需要在数值计算中不含有任
java 注释类型
J2SE 5.0 (Tiger) 的发布是 Java 语言发展史上的一个重要的里程碑 , 是迄今为止在 Java 编程方面所取得的最大进步。 J2SE 5.0 提供了很多令人激动的特性。这些特性包括范型 (generics) 的支持 , 枚举类型 (enumeration) 的支持 , 元数据 (metadata) 的支持 , 自动拆箱 (unboxing)/ 装箱 (autoboxing)