问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

浮点数精度问题详解

创作时间:
作者:
@小白创作中心

浮点数精度问题详解

引用
CSDN
1.
https://blog.csdn.net/weixin_45136016/article/details/139430682

浮点数精度问题一直是编程和计算机科学中的一个重要话题。本文将从浮点数的定义、二进制与十进制的转换、IEEE754表示方法、C#中不同浮点数类型的比较以及解决浮点数运算精度问题的方法等多个方面进行详细探讨。

1.什么是浮点数

因为资源的限制,数学中的小数无法直接在计算机中准确表示。为了更好地表示它,计算机科学家们发明了浮点数,这是对小数的近似表示。

也就是说浮点数是相对于定点数而言的,表示小数点位置是浮动的。比如 7.5 × 10、0.75 × 10² 等表示法,值一样,但小数点位置不一样。

具体来说,浮点数是指用符号、尾数、基数和指数这四部分来表示的小数。

2. 二进制与十进制的转换

2.1 二进制与十进制的相互转换(方法介绍,思维理解)

二进制与十进制的相互转换(方法介绍,思维理解)

2.2 在线转换工具

二进制与十进制在线转换工具

3.浮点数的 IEEE754 表示

因为基数固定是 2,因此不存

参考文章:

https://www.cnblogs.com/hzy1987/p/18021627

4.C# 浮点型float、double 、decimal 比较

类型
名称
bit
有效数字( 带有一个固定隐含位)
数值范围
是否基础类型
float
单精度浮点数
32
7(8)
±1.5×10E−45 ~ ±3.4×10E38
double
双精度浮点数
64
15(16)
±5.0×10E−324 ~ ±1.7×10E308
decimal
高精度浮点数
128
28
±1.0×10E−28 ~ ±7.9×10E28

5.解决运算精度问题

5.1 浮点数预算精度问题

public static void Main(string[] args)
{
     Console.WriteLine(0.3f - 0.2f);     // 0.10000001
     Console.WriteLine(0.3 - 0.2);       // 0.09999999999999998
}   

5.2 解决方案

5.2.1 放大倍数计算

var tmp1 = (0.3f * 10) - (0.2f * 10);
float a = tmp1/10;
Console.WriteLine(a);   // 0.1
var tmp2 = (0.3 * 10) - (0.2 * 10);
double b = tmp2/10;
Console.WriteLine(b);   // 0.1

5.2.2 ToString()

string str1 = (0.3f -0.2f).ToString("N3");  // 保留3位有效数字
string str2 = (0.3 -0.2).ToString("N3");    // 保留3位有效数
float.TryParse(str1, out float a);
Double.TryParse(str2, out double b);
Console.WriteLine(a);   // 0.1
Console.WriteLine(b);   // 0.1

5.2.3 Math.Round()

关于Math.Round()的使用:

C# Math.Round() 四舍六入五取偶

double a = Math.Round(0.3 - 0.2, 2, MidpointRounding.AwayFromZero);
Console.WriteLine(a);   // 0.1
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号