关于浮点数相加减的问题

问题描述

浮点数采用二进制系统表示,在二进制中无法精确的表示0.1,0.3等。因此在浮点数进行相加减的时候,答案就很可能得到误差。为什么在下面中2.0-0.1却能得到精确的值1.9呢?

解决方案

解决方案二:
使用Decimal
解决方案三:
引用1楼rui888的回复:

使用Decimal

谢谢,我想知道的是原理,为什么
解决方案四:

解决方案五:
摘自:http://blog.csdn.net/bingjing12345/article/details/7907095对double不能算出精确值问题的思考我知道double型数据在内存的表示遵循IEEE标准,对于0.1,1.1,2.1等等很多数,不能被精确的表示为double数据只能被表示为最接近它的double值先来看一段程序doubled1=0.9;doubled2=0.1;doubled3=1.1;System.out.println(d1);System.out.println(d2);System.out.println(d3);输出为:0.90.11.1输出结果并没有变成我们想象的那种0.99999999999999或者1.10000000000000001这说明0.1,1.1本身就是double型最接近它们的值。再来看一段:System.out.println(5.0-4.1);System.out.println(5.0-3.1);System.out.println(5.0-2.1);System.out.println(5.0-1.1);System.out.println(5.0-0.1);System.out.println("******************");System.out.println(4.0-3.1);System.out.println(3.0-2.1);System.out.println(2.0-1.1);System.out.println(1.0-0.1);System.out.println("******************");System.out.println(4.0-0.1);System.out.println(3.0-0.1);System.out.println(2.0-0.1);System.out.println(1.0-0.1);输出结果:0.90000000000000041.92.93.94.9******************0.89999999999999990.89999999999999990.89999999999999990.9******************3.92.91.90.9这些结果开始时超出了我的想象从第一组数据看,相差大于1的,好像结果是对的,从第二组看,相差小于1的,结果居然也有对的,从第三组看,和0.1作差的全是对的。那么0.1跟1.1,2.1等等其它数有什么不同呢?相差大于1的时候结果怎么就变对了呢?问题就出现在0.1的IEEE表示上,因为它标准化的时候0.1要小数点被向右移位,而其它数小数点像左移这样0.1算的实际位数要比2.1,3.1等等其它数多几位,即0.1本身的double型表示比2.1中的那个0.1要精确。在做double型减法运算时,需要经过对阶,求和,右规,舍入(0舍1入)操作如5.0-0.1对阶需要移动5位,计算舍入后最后得出4.9。这个4.9中的0.9其实是一个不精确的数,但0.9比0.8999999999999或者0.90000000001更接近真实值。而5.0-4.1对阶时不需要移动,计算舍入后最后得出0.9000000000000004,这个数也不是一个精确值,只是因为真实值相对于0.9000000000000003或者0.9000000000000005,跟接近与0.9000000000000004.假如我的想法正确,那么就是对阶移动位数比较多时,计算机能得出跟数学计算一样的值,否则得出一个其他值。验证System.out.println(100.0-0.1);System.out.println(100.0-99.1);99.90.9000000000000057综上,结论是对的。同样的道理,假如某个数a大于2^54;因为double型的尾数是52位,加上标准化的一位共53位,那么将a转换为double型时,采用恒掉的方法,只能取前53位,又假如a的第54位为0,则(double)a+1==(double)a
解决方案六:
那不是精确值1.9,只是后面还有好多位,浮点数位数把后面的给截了,截剩下的1.9后面的都是0就给省略了;

时间: 2024-10-26 10:57:38

关于浮点数相加减的问题的相关文章

swift 不正确浮点数相减结果 IOS

问题描述 swift 不正确浮点数相减结果 IOS 贴上代码: // // main.swift // HelloSwift // // Created by BearKuan on 15/11/22. // Copyright ? 2015年 BearKuan. ****All rights reserved. // import Foundation print("Hello, World!") var m = 100.0 var i = 0.1 while(i<99.9){

mysql 日期相加减sql查询语句

工作需要需要查询本月,本月来的数据进行排行,仔细一看数据库教程在数据库里保存的日期格式是2010-02-23 14:2:3这种类型的,这样我以为的按秒存在数据库的查询方法就不行了,在网上找到一款日期相加减sql函数 datediff(now,oldtime).测试了一下完全可以用下面我把我操作过程拿出.[ select * from t  where  datediff(now(),senddate)<31 order by click desc limit 0,10 //查询一个月内的点击数据

php 日期时间相加减

php 日期时间相加减 /**   * 时间相加运算   * @param int $increment 增量   * @param string $unit 单位   * @param string $returnFormat 返回的时间格式   * @return void   */  public function add($increment, $unit='s', $returnFormat = NULL) {   $increment = intval($increment);   

批量选择同时每行数据相加减

问题描述 本人做了一个批量选择功能,批量选择的同时一个栏位=另一个栏位减去其它一个栏位,但是减出来的值全部都是一样的,有没有那位高手可以帮帮我,以下这个批量功能的代码IfNotgrdVouchs.ActiveCellIsNothingThenIfgrdVouchs.DisplayLayout.Bands(0).Columns(grdVouchs.ActiveCell.Column.Index).CellActivation=Infragistics.Win.UltraWinGrid.Activa

sql中循环处理当前行数据和上一行数据相加减_MsSql

以下事例,使用游标循环表#temptable中数据,然后让当前行和上一行中的argument1 相加 存放到当前行的 argument2 中,比较简单. --drop table #temptable create table #temptable ( argument1 int, argument2 int, argument3 datetime ) declare @rowcount int,@argument1 int,@argument2 nvarchar(50),@argument3

java中实现超大整数相加减

 代码如下 复制代码 /**    * 整数加法    *    * @param lv    *            左值    * @param rv    *            右值    * @param result    *            相加的结果    * @数值存放说明 数值的每一位作为栈的一项存放在栈中,从栈底到栈顶依次是数值的高位到低位    * @算法描述 输入的加数倒序存放在栈中(即栈顶是数的最低位,栈底是数的最高位). 计算的时候,依次弹出栈中的数据,对

sql中循环处理当前行数据和上一行数据相加减

以下事例,使用游标循环表#temptable中数据,然后让当前行和上一行中的argument1 相加 存放到当前行的 argument2 中,比较简单. --drop table #temptable create table #temptable ( argument1 int, argument2 int, argument3 datetime ) declare @rowcount int,@argument1 int,@argument2 nvarchar(50),@argument3

|zyciis| .NET Double类型进行相加减时的崩溃问题(浮点计算出错) 肿么办????

问题描述 如:<%=48340.94-36255.7-12085.24%><br/><%=(36255.7+12085.24)-48340.94%><br/><%=48340.94-(36255.7+12085.24)%>结果为:5.45696821063757E-12-7.27595761418343E-127.27595761418343E-12而不是000-------------------------------------------

js浮点数精确计算(加、减、乘、除)_javascript技巧

复制代码 代码如下: <SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果.   //调用:accAdd(arg1,arg2)   //返回值:arg1加上arg2的精确结果   function accAdd(arg1,arg2){      var r1,r2,m;      try{r1=arg1.toString().split(".&