我有一个叫做xdouble变量.

if (x==0.1)
{
----
}

不幸的是,它没有进入if语句

  1. 我应该用Double还是double

  2. 这背后的原因是什么?你能提出一个解决方案吗?

推荐答案

由于计算机存储浮点值的方式,这是一个标准问题.在这里搜索"浮点问题",你会发现大量的信息.

简而言之,浮点数/双精度数不能精确地存储0.1.它总是会有点不对劲.

您可以try 使用decimal类型,它以十进制表示法存储数字.因此0.1将被精确地表示.


你想知道原因:

Float/double存储为二进制分数,而不是十进制分数.为了说明:

12.34在十进制记数法中(我们使用的)表示

1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2

计算机以同样的方式存储浮点数,只是它使用2:10.01的基数

1 * 21 + 0 * 20 + 0 * 2-1 + 1 * 2-2

现在,你可能知道有些数字不能用十进制表示法完全表示.例如,十进制表示法中的1/30.3333333….同样的事情在二进制记数法中也会发生,只是不能精确表示的数字是不同的.其中有1/10号.用二进制表示法,即0.000110011001100….

由于二进制记数法不能精确地存储它,因此它以四舍五入的方式存储.这就是你的问题所在.

.net相关问答推荐

使用React路由加载器获取数据不能正常工作

C#:如何构造异步/等待代码,其中许多请求是针对相同的、返回缓慢的数据发出的,这可以满足所有请求

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

在接口内部声明 IEnumerable 而在具体类中声明 IList

将 Span 传递到函数时出现 F# 错误

C#6.0 字符串插值本地化

HttpClient 请求抛出 IOException

.NET 中是否有一种简单的方法来获得数字的st、nd、rd和th结尾?

Winforms:Application.Exit vs Environment.Exit vs Form.Close

Automapper:使用 ReverseMap() 和 ForMember() 进行双向映射

.NET 等价于旧的 vb left(string, length) 函数

C#中的引用类型

在未安装 Visual Studio 的机器上使用 FUSLOGVW.EXE

如何允许程序集(单元测试)访问另一个程序集的内部属性?

如何获得 Bin 路径?

我应该如何删除 DbSet 中的所有元素?

如何以编程方式删除 WebClient 中的 2 个连接限制

如何使用 DateTime 指定一天中的最晚时间

多个列表与 IEnumerable.Intersect() 的交集

通过反射获取公共静态字段的值