Dart tryParse双精度浮点型与字符串转换为双精度浮点型

3

在Dart中使用tryParse存在一些不一致,或者我正在以一种愚蠢的方式尝试使用它,很可能是后者造成的。

当我们使用int.tryParse语句时,如果将10.0作为double传递给它,我们希望得到的是10,而实际上我们确实得到了10。

print(int.tryParse(10.0.toString())); ==> 10

如果我们将字符串“10.0”传递给它,它将返回null。
print(int.tryParse('10.0')); ==> null

我觉得这有点奇怪,因为我认为10.0.toString()等同于'10.0'。

有人能解释一下吗?


你是在DartPad上测试还是在Flutter/Dart应用程序中测试? - GrahamD
1
我已经在Flutter和Dartpad中测试过它。最初我在Flutter中遇到了这个问题,然后在Dartpad中进行了测试。 - Levy77
你可以轻松测试并发现10.0.toString()与答案中所示的10.0不等价。此外,对于与Flutter无直接关系的问题,请勿添加Flutter标签。 - Christopher Moore
3个回答

2
区别在于Web编译器和本机代码之间。
当Dart被编译到Web(转换为JavaScript)时,所有数字都是JavaScript数字,这实际上意味着双倍数。这意味着整数10和双倍数10.0是相同的对象。JavaScript中只有一个“10”值。因此,当您对该值执行toString操作时,它必须进行选择,并选择"10"而不是"10.0"
当本地运行时,双倍数10.0和整数10是两个不同的对象,它们的toString分别为"10.0""10"int.tryParse函数不接受"10.0"作为输入,这就是为什么它返回null的原因。因此,在Web上进行测试(包括dartpad.dev),int.tryParse(10.0.toString())成功,因为toString"10",而在本地测试相同的代码会得到null,因为toString"10.0"

1

10.0.toString() 返回的是 '10',而不是 '10.0'。这就是为什么你会得到不同的结果。 这里 是相同的问题。因此,我理解我们有以下情况:

  • 在 js 目标上,Dart 中的 10.0 被解析为 int(并且在链接中说,intdouble 在 js 目标上的区别并不大);
  • 在 Dart VM 上,Dart 中的 10.0 被解析为 double,但 toString 方法返回该数字可能的最短文本表示,即 10

0

这似乎是编译器的行为。我找不到任何人报告这个问题。也许当你在逗号后面有零时,toString方法会四舍五入。如果逗号后面都是零,则会转换为整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接