更简单的算术

时间:2015-11-28 03:31:13

标签: javascript clojurescript

在Clojurescript中,我正在做一个减号 - 从另一个号码中取一个号码:

(let [external-take-central (- external-val central-y)
      _ (log "Ans: " external-take-central " from " external-val " take " central-y)

这个输出可能涉及很多不必要的小数位:

Ans: 0.10000000000000142 from 21.1 take 21
Clojurescript上不存在

rationalizeBigDecimal也不存在。

在Javascript执行环境中明智地处理这些浮点算术错误的最佳方法是什么?

在这种情况下,我希望external-take-central本身不会略大于/小于0.1。我想找到一种通用的方法来使计算准确且易于推理。

1 个答案:

答案 0 :(得分:0)

这取决于您希望如何使用该值。您可以使用可用的JavaScript库和函数。一般来说,在考虑加载一个单独的库之前,我倾向于查看谷歌闭包库,因为你避免了必须定义外部等问题。

一种可能的解决方案是使用google.string lib,即

(ns ....
  (:require [google.string :as gstr]))

(gstr/format "%.2f" value)

或类似的东西应该可以将您的值格式化为只有2位小数的字符串。

编辑:根据评论添加更多信息并澄清一些观点。

请注意,Clojurescript数字只是javascript编号,可以在任何接受数字的javascript函数中使用。所以,例如你可以做到

(.round js/Math 3.00001)

甚至

(.toFixed 3.0002 2)

或更复杂的东西,具体取决于您的要求。我会警惕每个计算步骤的舍入/截断。在某些情况下,这可能有意义(例如,您可能希望将资金计算限制为2位小数),但在其他情况下,您只需通过执行此操作来增加舍入误差量。对于像货币delaing这样的人,我倾向于使用clojurescript或为此目的编写的javascript库。