js,java,浮点数运算错误及应对方法

js,java,浮点数运算错误及应对方法

一,浮点数为什么会有运算错误

IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换、算术格式以及方法.

现有存储介质都是2进制。2进制的进制基数是2,那么一个数字只要被因素包含大于2的质数的数除,都会产生无限循环小数。无限循环小数和无理数都无法,和非无限循环的有理数一起用同一种方式存储到存储介质上的同时还保持计算的兼容性。
对于无限循环小数,可以设计一种格式存储到介质上,但是同时又要和非无限循环的有理数能够计算,效率应该会变得非常低下。 对于无理数,小数位的数字没有规律可循,所以根本无法保存精确值,只能保存近似值。
高精度计算,一般可以将数字转发成string, 去掉小数点,按位计算再保存回string,再加回小数点。

二,错误举例

document.write (0.01 + 0.05);  //输出结果为0.060000000000000005

document.write (0.09 + 0.01);  //输出结果为0.09999999999999999

document.write(11*22.9);     //输出结果为251.89999999999998

三,js如何应对

扩大倍数法:有多少位小数就扩大10的n次方

document.write((0.01*100+0.09*100)/100); //输出结果为0.1

四舍五入法:

document.write((0.01+0.09).toFixed(2)); //保留2位小数,输出结果为0.10

document.write(Math.round((0.01+0.09)*100)/100); //输出结果为0.1

四,java如何应对

扩大倍数法:有多少位小数就扩大10的n次方

System.out.println((0.01*100+0.09*100)/100); //输出结果为0.1

四舍五入法:

System.out.println(Math.rint(0.01*100+0.09*100)/100); //输出结果为0.1

System.out.println(Math.round(0.01*100+0.09*100)/100); //输出结果为0.1

System.out.println(new  BigDecimal(0.099).setScale(2,  RoundingMode.HALF_UP).doubleValue()); 
//输出结果为0.10


备注: Java支持7中舍入法

1、 ROUND_UP:远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。

2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。

3、 ROUND_CEILING:向正无穷方向舍入。向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。

4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。

5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。

6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。

7、 HAIL_EVEN:银行家舍入法。银行家舍入法.

时间: 2024-10-16 03:50:42

js,java,浮点数运算错误及应对方法的相关文章

maven执行打包命令(mvn package)是出现Java heap space错误的解决方法(windows环境)

今天执行maven的打包命令出现时内存溢出的错误,以下为解决方法 找到mvn目录下bin目录里的mvn.bat, 找到@REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000, 在这局下添加以下语句: set MAVEN_OPTS=-Xms256m -Xmx768m -XX:PermSize=128m -XX:Ma

Java一种错误的实例化方法:在默认无参构造函数中进行实例化

代码如下: package Construction_test; public class A { static int i=0; public A() { //默认构造方法 i++; System.out.println("---before--- " + i); A a2 =new A(); //实例的时候调用无惨构造方法 System.out.println("---after---"); } public static void main(String[]

速达ERP系列应用技巧---(001)避免成本运算错误的方法

相信很多速达软件用户在使用过程中,都出现过成本价为负数的问题,捷力达专家现总结了避免成本运算错误的处理方法,方法如下:     1.建议尽量使用全月一次法作为成本核算方法     2.一定要设置货品参考进价     3.禁止负库存出库     4.禁止期未负库存结账       如果您想进一步了解,请致电0532-83845676/83832586,捷力达专家将竭诚为您服务! 微信平台:qdjielida1,同步传送,敬请关注! 企业名片                 微信公众号      

Java之浮点数运算

浮点数运算和整数运算相比,只能进行加减乘除这些数值运算,不能做位运算和移位运算. 在计算机中,浮点数虽然表示的范围很大,但是浮点数有个非常重要的特点,就是浮点数常常无法精确表示 举例 浮点数0.1在计算机中就无法精确表示,因为十进制的0.1换算成二进制是一个无限循环小数,很显然,无论使用float还是double,都只能存储一个0.1的近似值.但是,0.5这个浮点数又可以精确地表示.因为浮点数常常无法精确表示,因此,浮点数运算会产生误差: public class Main { public s

【javascript】浮点数运算问题分析及解决方法

问题: 在用 js 进行小数四则运算时发现了一个重大问题,比如:0.7 * 0.8 = 0.5599999999999999 分析: 在 js 中只有一种数字类型 Number,而且在 js 中所有的数字都是以 IEEE-754 标准格式表示的.浮点数的精度问题并不是 js 特有的,因为有些小数以二进制表示位数是无穷的,比如 1.1,其程序实际上无法真正的表示 1.1,而只能做到一定程度上的准确(1.09999999999999999),这是无法避免的精度丢失. 通过 chrome 控制台,我们

Win7,Win8安装ArcGIS软件或Node.js等安装包出现2503错误的解决方法

最近win8系统在安装Node.js和ArcGIS软件的时候都出现了2503错误,后来才发现,都是Win8的权限系统在作怪.解决方法看似也挺原始,但很奏效: 1)进入C:\windows\installer路径,找到安装程序的msi.如果你的安装包没有把msi文件解压到这个路径下,请将对应的msi和CAB文件复制到这个路径下,比如ArcGIS的安装程序. 2)以管理员身份打开cmd程序 3)在命令行中输入"C:\windows\installer\xxx.msi"并回车.由下面的截图能

由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入

public class Arith { /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入. */ // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 这个类不能实例化 private Arith() { } /** * 提供精确的加法运算. * * @param v1 * 被加数 * @param v2 * 加数 * @return 两个参数的和 */ p

深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer12.html 前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题.这一点其实在我们平时的计算当中会经常出现,就比如之前我们提到过的0.3,它就是无法用浮点小数准确表示的. 为此LZ专门写了一个小程序,使用Java语言打印出了0.3的二进制表示,

java提供的读取properties文件方法,应对编码问题

Properties prop=new Properties(); prop.load(Client.class.getClassLoader().getResourceAsStream("config.properties")); java提供的读取properties文件方法,应对编码问题