感谢阅读这篇文章,我已经挣扎了一段时间了--我正在使用Aeson/TH自动生成ADT的fromJSON/toJSON。我使用Yesod来接受来自HTTP的数据。
import Data.Aeson hiding (json)
import Language.Haskell.TH
import Data.Aeson.TH
import Data.Aeson.Types
data Money = USD Float
$(deriveJSON defaultOptions ''Money)
.... -- getting request from HTTP
_money <- requireCheckJsonBody :: Handler Money问题是,如果我在Money中传递一个大的nubmer,比如USD 1157265240.03,但是_money将有1,157,265,300.0的浮动值,它将240循环到300。
这看起来是由字符串Scientific notation转换为浮点数引起的,这将使数字的尾部部分更加模糊。
你知道如何绕过这种导致精度下降的转换吗?谢谢

发布于 2022-09-04 18:13:32
缺乏精确性与yesod或aeson无关,而是与您选择Float作为数据类型有关。在1157265240.03 :: Float提示符下输入GHCi,您将得到1.1572653e9。IEEE单精度浮标不能比震级达到如此高的值更精确地表示数量。(具体来说,单精度浮点数在1,157,265,152.00和1,157,265,408.00之间的唯一数字是1,157,265,280.00。你需要一个不同的数据类型。Aeson内部使用the Scientific datatype存储JSON数字,这是任意精度的。另一个合理的选择是Centi from Data.Fixed。
https://stackoverflow.com/questions/73601279
复制相似问题