2024 Clojure状态调查中分享您的想法!

欢迎!请查看关于页面,了解更多关于这一功能的信息。

0
ClojureScript

针对负数的解决方案会生成令人烦恼的浮点数行为(https://dev.clojure.org/jira/browse/CLJS-417

(mod 2.1 3) ; => 2.0999999999999996

Clojure和标准的JavaScript modulo在这里都返回预期的2.1。

两种可能的解决方案

  • 仅在分子实际为负时执行double-mod修正
  • 如果分子小于除数,则仅返回它

9 个答案

0

评论由:dnolen

欢迎提交补丁。

0

评论由:zto

补丁将cljs.core/mod重命名为double-mod,并在两个参数有相同符号时直接调用js-mod来重新定义mod。
它包括了对先前失败的用例的测试案例,但我还对其针对Clojure实现进行了更彻底的测试: https://gist.github.com/aw7/a32bd69923c65bddc23fd63ee062833c

0

评论由:dnolen

非常感谢,你已经提交了Clojure CA了吗?

0
by

评论由:zto

是的,两小时前。

0
by

评论者:anmonteiro

注意:难道不应该将 double-mod 函数标记为私有吗?

0
by

评论由:zto

我认为大概 double-mod 成为一个独立的函数完全没有必要,我在补丁中将其内联到 mod 中了。

0
by
_评论者:mfikes_

André,ClojureScript需要一个紧凑的补丁(CLJS-2319-Fix-cljs.core-mod-handling-of-floats_INLINED.patch 其中有两个补丁)。请参见 https://script.clojure.org/community/patches
0
by

评论者:mfikes

糟糕... 补丁中的某些东西破坏了我们用 Travis 运行的旧版 JavaScriptCore。我唯一的猜测是额外的 mod 测试可能触发了 CLJS-910,但这似乎不太可能。

0
by
...