【问题标题】:format float with stripped trailing zeros and decimal point, switching to scientific notation for large numbers in haskell格式化浮点,去除尾随零和小数点,在haskell中切换到大数的科学记数法
【发布时间】:2016-06-28 22:59:18
【问题描述】:

我正在 Haskell 中寻找一种方法,以完全按照this (Java) question 中描述的方式格式化浮点数,以获得最佳紧凑性。我认为这也可以称为“规范化”。

我将在此处复制该问题中的示例场景:

2.80000 -> 格式应为"2.8"

765.000000 -> "765"(注意小数点也被去掉了)

0.0073943162953 -> "0.00739432"(在这种情况下将精度限制为 6 位)

0.0000073943162953 -> "7.39432E-6"(如果幅度足够小,则切换到科学计数法——在这种情况下小于1E-5

7394316295300000 -> "7.39432E+6"(如果幅度足够大,则切换到科学计数法——例如,大于1E+10时)

0.0000073900000000 -> "7.39E-6"(从科学计数法的有效数字中去除尾随零)

0.000007299998344 -> "7.3E-6"(从 6 位精度限制四舍五入会导致该数字的尾随零被去除)

Haskell 中是否有内置库可以做到这一点,还是我必须自己开发?

【问题讨论】:

  • “Haskell 中是否有内置库可以做到这一点,还是我必须自己动手?” 您可能想要编辑它。要求图书馆是题外话。

标签: haskell printf decimal normalization


【解决方案1】:

您正在寻找的是来自GHC.Float 模块的formatRealFloat。我不确定 haskell.org 上是否有适用于该模块的文档,但这里是该模块的摘要:http://www.cis.upenn.edu/~bcpierce/courses/advprog/resources/base/GHC.Float.html

您当然需要对其进行修改以满足您的需要,但这里有一个示例:

import GHC.Float

formatFloat :: RealFloat a => a -> String
formatFloat v
  | v == 0                          = "0"
  | abs v < 1e-5 || abs v > 1e10    = formatRealFloat FFExponent Nothing v
  | v - fromIntegral (floor v) == 0 = formatRealFloat FFFixed   (Just 0) v
  | otherwise                       = formatRealFloat FFGeneric  Nothing v

当然,它只适用于 ghc 编译器。

【讨论】:

  • 太棒了!这应该是最好的答案。
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2021-04-21
相关资源
最近更新 更多