- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Cuerdas library在一个解析 float 的 ClojureScript 程序。有时输入来自用户缺少不可或缺的部分,例如 .1
表示 0.1
。我需要处理这个。但是在比较解析后的数字时我遇到了奇怪的结果:
(= 0.1 (parse-number "0.1"))
;; => true
(= .1 (parse-number "0.1"))
;; => true
(= 0.1 (parse-number ".1"))
;; => false
(= .1 (parse-number ".1"))
;; => false
上面的最后两个结果让我感到惊讶。比较文字数字时我得到预期的结果:
(= 0 .0)
;; => true
当我只解析没有整数的十进制数时,奇怪的行为也可见部分,就像这里:
(parse-number ".1")
;; => .1
.1
;; => 0.1
我发现我可以使用 js/parseFloat
来得到我想要的东西,但我很好奇使用 Cuerdas 时出现这种行为的原因是什么?这个 .1
值是多少它与 0.1
有何不同?
最佳答案
parse-number
来源看起来像这样:
(defn parse-number
"General purpose function for parse number like
string to number. It works with both integers
and floats."
[s]
(if (nil? s)
#?(:cljs js/NaN :clj Double/NaN)
(if (numeric? s)
(edn/read-string s)
#?(:cljs js/NaN :clj Double/NaN))))
".1"
和"0.1"
都被认为是numeric?
(通过正则表达式检查在 cuerdas 中实现):
cljs.user=> (def re #"^[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?$")
#'cljs.user/re
cljs.user=> (boolean (re-matches re "0.1"))
true
cljs.user=> (boolean (re-matches re ".1"))
true
所以它们将被 cljs.reader/read-string
读取.
当读取字符串 "0.1"
时,返回类型是 js/Number
,但是 ".1"
是 类型>cljs.core/符号
:
cljs.user=> (cljs.reader/read-string ".1")
.1
cljs.user=> (cljs.reader/read-string "0.1")
0.1
cljs.user=> (type (cljs.reader/read-string "0.1"))
#object[Number]
cljs.user=> (type (cljs.reader/read-string ".1"))
cljs.core/Symbol
因此,虽然它看起来正确地解析了 .1,但实际上它把它变成了一个符号。符号 .1
不等于数字 .1
。
注意 parse-number
是 no longer available in newer versions cuerdas 因为它“是一个字符串操作库而不是数字解析库”。
关于parsing - 在 ClojureScript 程序中使用 Cuerdas 解析十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716573/
我正在使用 Cuerdas library在一个解析 float 的 ClojureScript 程序。有时输入来自用户缺少不可或缺的部分,例如 .1 表示 0.1。我需要处理这个。但是在比较解析后的
我是一名优秀的程序员,十分优秀!