为什么"M"出现在Clojure MySQL查询结果中

oct*_*bus 2 mysql sql jdbc clojure

我有一个返回行的Clojure查询,这里是返回行(map)的部分打印输出.

({:employer_percent 0.00M, ... :premium 621.44M, ...})

这两列分别是mysql表中的十进制(5,2)和十进制(7,2).

为什么在每个值的末尾都有一个'M'后缀?这是形成和执行查询的代码.

    (def db {:classname "com.mysql.jdbc.Driver"
             :subprotocol "mysql"
             :subname "//system/app"
             :user "app-user"
             :password "pwrd"})

  (defn get-recent-gic-rows
  [search-date lt-toggle]
  (let [query (if (= 0 lt-toggle)
   (str "select g.* from gic_employees g where g.processed_date <= '" search-date "' order by g.processed_date desc limit 1  ")
   (str "select g.* from gic_employees g where g.processed_date <  '" search-date "' order by g.processed_date desc limit 1  "))]

        (j/query db
             [query])))
Run Code Online (Sandbox Code Playgroud)

nta*_*lbs 6

M后缀表示数字是BigDecimal.你可以在REPL中查看

user=> (class 1)
java.lang.Long
user=> (class 1.0)
java.lang.Double
user=> (class 1M)
java.math.BigDecimal
Run Code Online (Sandbox Code Playgroud)

由于您的数据库列类型是decimal(5,2)decimal(7,2),因此将数字转换为float或者double因为这些浮点类型无法表示所有数字decimal(5,2)decimal(7,2)准确的数字是不安全的.

您可以使用关键字"浮点不准确"进行谷歌搜索.Stackoverflow中还有大量的文章和问答.