无类型的十进制文字

问题描述

使用此代码

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,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);
}