首页 技术 正文
技术 2022年11月11日
0 收藏 843 点赞 4,063 浏览 1535 个字

在工作中我发现了一个C#浮点数的精度问题,以下的程序运行结果并未得到我预期的结果:

view source

print?

01 namespace FloatTest
02
03     class Program
04     
05         static void Main(string[] args)
06         
07             double a = 0.0001;
08             float b = 0.1F;
09   
10             int c = (int)((a * 1000) / b);
11   
12             Console.WriteLine("c = {0}", c);
13   
14             Console.ReadLine();
15         
16     
17 }

我期望的结果是得到1,结果程序返回的结果为c = 0

这让我想到了可能是因为浮点数采用IEEE754的表示方法,在运算中b会转换成double,可能是在转换中算法的问题导致精度丢失,为了证实该问题,我做了下面的实验:

view source

print?

01 namespace FloatTest
02
03     class Program
04     
05         static void Main(string[] args)
06         
07             double a = 0.0001;
08             float b = 0.1F;
09   
10             int c = (int)((a * 1000) / b);
11   
12             Console.WriteLine("a = {0}", a);
13             Console.WriteLine("b = {0}", Convert.ToDouble(b));
14             Console.WriteLine("c = {0}", c);
15   
16             Console.ReadLine();
17         
18     
19 }

这次果然得到了意料中的结果:float在转成double的时候出现了精度的丢失问题

a = 0.0001
b = 0.100000001490116
c = 0

如果是在类型转换的时候导致的精度丢失,那我把b改为double应该可以解决这个问题:

view source

print?

01 namespace FloatTest
02
03     class Program
04     
05         static void Main(string[] args)
06         
07             double a = 0.0001;
08             double b = 0.1;
09   
10             int c = (int)((a * 1000) / b);
11   
12             Console.WriteLine("a = {0}", a);
13             Console.WriteLine("b = {0}", Convert.ToDouble(b));
14             Console.WriteLine("c = {0}", c);
15   
16             Console.ReadLine();
17         
18     
19 }

这次却是得到我们期望的结果:

a = 0.0001
b = 0.1
c = 1

因此,在程序中,我们应该尽量的避免浮点数类型转换导致的精度丢失。

我在GCC上做了同样的实验,结果不管哪种方式得到的结果都是正确的,我只能说可能是double Convert.ToDouble(float)的实现的原因导致的。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,737
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,489
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,128
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,290