Dart tryParse double vs string of double

Dart tryParse double vs string of double

在 Dart 中使用 tryParse 的方式似乎有些不一致,或者我正在采用一种愚蠢的方式,可能是后者。

当我们使用 int.tryParse 语句时,如果我们将 10.0 作为双精度数传递给它,我们将期望得到 10,而我们确实这样做了。

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

如果我们将 10.0 作为字符串传递给它,它将 return 为空。

print(int.tryParse('10.0')); ==> null

我觉得这有点奇怪,因为我认为 10.0.toString() 等同于“10.0”。 有人有解释吗?

10.0.toString() returns '10',而不是 '10.0'。这就是为什么你有不同的结果。 Here 只是同一个问题。因此,据我了解,我们有:

  • dart 10.0 在 js 目标上解析为 int(并且在 js 目标上 intdouble 之间没有太大区别,如上所述link);
  • dart 10.0 在 dart VM 上解析为 double,但 toString returns 该数字的最短可能文本表示,即 10

这似乎是一种编译器行为。我找不到报告此问题的人。也许当逗号后有零时,toString 方法会将其四舍五入。如果逗号后全为零,那么它将转换为 int.

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" 作为输入,这就是它 returns null 的原因。 因此,在 Web 上测试时(包括 dartpad.dev),int.tryParse(10.0.toString()) 成功,因为 toString"10",而在本机测试时,相同的代码给出 null,因为toString"10.0".