为什么在clojure中添加1.00、2.00总是会得到3.0?

为什么在clojure中添加1.00、2.00总是会得到3.0?,clojure,decimal,add,Clojure,Decimal,Add,我不知道这是不是一个问题,或者是它的方式,但我需要一个小数点后两位的值。我可以编写一个函数将其四舍五入到小数点后2位,但是有没有一个解决方案,在clojure中,在添加时自己处理它。我的意思是改变数据类型之类的 多谢各位 Clojure在后台使用java的标准双精度浮点数字(从1.3开始),而REPL只打印表示数字所需的数字,因此在本例中,它将获得3.0000000。。。但是删除不必要的数字 您可以使用handy功能控制打印的数字 (format "%.2f" (+ 1.0 2.0)) >

我不知道这是不是一个问题,或者是它的方式,但我需要一个小数点后两位的值。我可以编写一个函数将其四舍五入到小数点后2位,但是有没有一个解决方案,在clojure中,在添加时自己处理它。我的意思是改变数据类型之类的


多谢各位

Clojure在后台使用java的标准双精度浮点数字(从1.3开始),而REPL只打印表示数字所需的数字,因此在本例中,它将获得3.0000000。。。但是删除不必要的数字

您可以使用handy功能控制打印的数字

(format "%.2f" (+ 1.0 2.0))
> "3.00"

Clojure在后台使用java的标准双精度浮点数字(从1.3开始),REPL只打印表示数字所需的数字,因此在本例中,它获得了3.0000000。。。但是删除不必要的数字

您可以使用handy功能控制打印的数字

(format "%.2f" (+ 1.0 2.0))
> "3.00"

3.0
在clojure中等于
3.00
,是一个双精度,如果要输出一个小数点后两位的str,可以使用格式

user> (= 3.0 3.00)
true
user> (== 3.0 3.00)
true
user> (format "%.2f" 3.0)
"3.00"
user> (class 3.00)
java.lang.Double

3.0
在clojure中等于
3.00
,是一个双精度,如果要输出一个小数点后两位的str,可以使用格式

user> (= 3.0 3.00)
true
user> (== 3.0 3.00)
true
user> (format "%.2f" 3.0)
"3.00"
user> (class 3.00)
java.lang.Double

如果您需要进行精确的十进制运算,您可以使用“M”后缀书写数字,以表明它们是精确的:

user=> (+ 1.00M 2.00M)
3.00M

但是要注意,这比使用标准的不精确浮点数效率要低得多。

如果您需要进行精确的十进制运算,您可以用“M”后缀来表示这些数字是精确的:

user=> (+ 1.00M 2.00M)
3.00M

但是要注意,这比使用标准的不精确浮点数的效率要低得多。

格式函数也会解决这个问题。是P re REPL打印的数字太少。这个答案中的链接涵盖了很多方法,可以使数字的格式满足大多数需求。但这并不能解决我的问题。。我不想在这里调用函数。。。但感谢您的快速重播..在noir中,当您在响应映射中传递一个数字时,该映射将使用默认打印功能转换为字符串,作为最终答复的一部分,如果您希望使用格式而不是默认格式,则使用字符串可能是唯一可行的答案。@Arthur Ulfeldt。。我只是那样做了。。这似乎奏效了。。但是有100个这样的反应图,我在哪里可以做同样的事情。。这真的很痛苦。@Sandy:你可以在一个地方实现一个环形中间件函数,格式函数也可以在那里解决这个问题。是P re REPL打印的数字太少。这个答案中的链接涵盖了很多方法,可以使数字的格式满足大多数需求。但这并不能解决我的问题。。我不想在这里调用函数。。。但感谢您的快速重播..在noir中,当您在响应映射中传递一个数字时,该映射将使用默认打印功能转换为字符串,作为最终答复的一部分,如果您希望使用格式而不是默认格式,则使用字符串可能是唯一可行的答案。@Arthur Ulfeldt。。我只是那样做了。。这似乎奏效了。。但是有100个这样的反应图,我在哪里可以做同样的事情。。这真的很痛苦。@Sandy:您可以在一个地方实现一个环中间件函数来实现这一点