You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中为何0.025f、0.025与0.025m相等?

在C#中为何0.025f、0.025与0.025m相等?

嘿,这个问题得从浮点数的存储逻辑说起,我给你掰扯明白~

先把你提到的完整代码整理出来:

float initialResolutionFloat = 0.025f;
double initialResolutionDouble = 0.025;
decimal initialResolutionDecimal = 0.025m;

decimal resolutionFloat = (decimal)initialResolutionFloat;
decimal resolutionDouble = (decimal)initialResolutionDouble;
decimal resolutionDecimal = (decimal)initialResolutionDecimal;

bool floatEqual = resolutionFloat == resolutionDecimal;
bool doubleEqual = resolutionDouble == resolutionDecimal;

// 你截断的部分应该是类似验证预期值的代码,比如:
// decimal expectedFloat = 0.0250000001490116119384765625m;

核心原因在于0.025这个数值的特殊性:它能被转化为有限的二进制分数。拆解一下:
0.025 = 1/40 = 1/(8×5) = 2⁻³ × 5⁻¹。而C#里的float(单精度)和double(双精度)都是基于IEEE 754标准的浮点数,本质是用二进制分数存储数值——只要一个十进制数能转成有限的二进制分数,就能被这两种类型精确存储。

  • 对于0.025f:float的精度足够容纳这个有限二进制分数,所以它在内存里就是精确的0.025,转成decimal后自然和0.025m完全一致,floatEqual也就为true。
  • 对于0.025(double类型):double的精度比float更高,当然也能精准存储这个值,转decimal后和0.025m毫无差异,doubleEqual也会是true。

反过来举个反例,比如0.1这个数,它的二进制是无限循环的(类似十进制里的1/3),所以float和double存的都是近似值,转成decimal后就会和0.1m不相等,这时候相等判断就会返回false了。

备注:内容来源于stack exchange,提问作者Gilles jr Bisson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:23:03