博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中double值的精度问题
阅读量:6220 次
发布时间:2019-06-21

本文共 1408 字,大约阅读时间需要 4 分钟。

在开发的时候,遇到一个问题,c#中定义一个double变量,当这个变量在很大的时候,让这个变量加上或者减去一个较小的值不会改变其大小(这个其实与double变量的二进制存储机制相关),就是说加上一个值之后的值.comPareTo(原来的值)返回0,就是说他们相等。

于是我想找到哪个具体的值是在加上或者减去1时,值的改变可以被检测到的。于是有了以下代码。

//因为相当大的范围内都是可以检测到大小改变的,所以不从1开始,节约时间            double a = 10000000;            double pre_a = 0;            double b = 0;            double c = 0;            int c1 = 0;            int c2 = 0;            double addValue = 1;            while (true)            {                pre_a = a;                a += addValue;                b = a + 1;                c = b + 1;                c1 = a.CompareTo(b) ;                c2 = b.CompareTo(c);                if ((c1 < 0) && (c2 == 0))                {                    //输出最后结果                    Console.WriteLine("a = " + a + "  b = " + b + "  c = " + c);                    break;                }                if ((c1 < 0) && (c2 < 0))                {                    addValue *= 2;                }                else                {                    //求解过程中,跳过了目标值,回到上一个值从新开始找                    Console.WriteLine("跳过目标值,a=" + a);                    a = pre_a;                    addValue = 1;                }            }

求出来的结果是:a=90071992647409921

实际上,根据double值的存储结构应该是可以从理论上推算出来这个值的。详细的机制以及使用的注意事项参见MSDN(下方的链接)。这个具体的理论推算过程先留个坑在这里吧,以后有时间了过来填。

参考:

http://technet.microsoft.com/zh-cn/library/system.double

转载于:https://www.cnblogs.com/zhang-ming/p/4035103.html

你可能感兴趣的文章
spring配置多数据源问题
查看>>
IOS中的属性列表----Property List
查看>>
如何通过网页启动应用程序
查看>>
ORA-00845: MEMORY_TARGET not supported on this system
查看>>
android 获取路径目录方法以及判断目录是否存在,创建目录
查看>>
使用ajaxFileUpload实现异步上传图片
查看>>
Python 杂集
查看>>
Another Eight Puzzle
查看>>
炸弹人——NABCD分析
查看>>
【前端积累】背景图像和背景替换
查看>>
ibatis sqlmap动态SQL
查看>>
使用WdatePicker日期组件时,选择日期后,执行某个方法
查看>>
HttpClient---------demo
查看>>
把玩爬虫框架Gecco
查看>>
递 归
查看>>
CSS3实现纸张边角卷起效果
查看>>
Windows平台AnyChat视频显示
查看>>
Altium 拼板方法以及 注意的 地方
查看>>
《推荐系统实践》序言、样章欢迎阅读!
查看>>
Android系统源码学习步骤
查看>>