首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用科学的观念解读圆周运动

用科学的观念解读圆周运动
EN

Stack Overflow用户
提问于 2022-09-04 17:02:08
回答 1查看 169关注 0票数 0

感谢阅读这篇文章,我已经挣扎了一段时间了--我正在使用Aeson/TH自动生成ADT的fromJSON/toJSON。我使用Yesod来接受来自HTTP的数据。

代码语言:javascript
复制
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转换为浮点数引起的,这将使数字的尾部部分更加模糊。

你知道如何绕过这种导致精度下降的转换吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73601279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档