无类型的十进制文字
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
不是 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;
所以在你的情况下,你可能 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);
}
使用此代码:
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
不是 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;
所以在你的情况下,你可能 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);
}