如何解决无类型的十进制文字
使用此代码:
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,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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。