无类型的十进制文字

Untyped decimal literals

使用此代码:

import std.conv, std.stdio;

void main() {
   auto s = "2.9";
   auto n = s.to!(float);
   auto n2 = s.to!(double);
   auto n3 = s.to!(real);
   [n == 2.9, n2 == 2.9, n3 == 2.9].writeln;
}

我得到这个结果:

[false, false, false]

嗯?如果文字 2.9 不是 floatdoublereal,它是什么?

在 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;

所以在你的情况下,你可能 should use std.math.approxEqual:

[approxEqual(n, 2.9), approxEqual(n2, 2.9), approxEqual(n3, 2.9)].writeln;

我还推荐 Don Clugston 的 DConf 2016 演讲,Using Floating Point Without Losing Your Sanity

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

import std.conv, std.stdio;

void main() {
   auto s = "9.9";
   auto n = s.to!(float);
   writeln(n == 9.9f);
}