Types 非类型化十进制文本

Types 非类型化十进制文本,types,casting,floating-point,d,Types,Casting,Floating Point,D,使用此代码: 导入标准conv、标准stdio; void main(){ 自动s=“2.9”; 自动n=s.to!(浮动); 自动n2=s.to!(双); 自动n3=s.to!(真实); [n==2.9,n2==2.9,n3==2.9]; } 我得到这个结果: [false, false, false] 嗯?如果一个文本2.9不是一个float、double或real,它是什么?在run.dlang.io上,我看到[false,true,true] 这可能会提示您为什么会看到这样的结果:

使用此代码:

导入标准conv、标准stdio;
void main(){
自动s=“2.9”;
自动n=s.to!(浮动);
自动n2=s.to!(双);
自动n3=s.to!(真实);
[n==2.9,n2==2.9,n3==2.9];
}
我得到这个结果:

[false, false, false]

嗯?如果一个文本
2.9
不是一个
float
double
real
,它是什么?

在run.dlang.io上,我看到
[false,true,true]

这可能会提示您为什么会看到这样的结果:

writefln("%a", n);
writefln("%a", n2);
writefln("%a", n3);
writefln("%a", 2.9);
由于浮点值的存储方式,当您对它们进行任何类型的转换时,您不能依赖它们。在本例中,由于值是从字符串中解析出来的,因此无法看到与文本
2.9
匹配的精确位模式。将其与下面的代码进行对比,这将产生一个
true
值数组:

auto n = 2.9;
auto n2 = 2.9;
auto n3 = 2.9;
[n == 2.9, n2 == 2.9, n3 == 2.9].writeln;
因此,在您的情况下,您可能:


我还推荐Don Clugston的DConf 2016演讲。

作为一种解决方法,您可以在文字中添加
f
,如下所示:

导入标准conv、标准stdio;
void main(){
自动s=“9.9”;
自动n=s.to!(浮动);
写入n(n==9.9f);
}

也引用“没有后缀的浮动文字”是双类型的。“好的,相关的,读的:-它是C++,但它是主题。我不认为这总是工作。“9.9”->四舍五入到最近的
double
,然后
s到!(浮点)
将其四舍五入到最接近的
float
。这是四舍五入,偶尔会与
9.9f
不同,后者根据是否使用9.9、1.23、4.2等将文本直接四舍五入为
float
。也许十亿分之一的不可表示常数会有这个问题。
[approxEqual(n, 2.9), approxEqual(n2, 2.9), approxEqual(n3, 2.9)].writeln;