Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
第3章 練習問題 D
- 尻高君の floor では上手くいかない理由は科学記法による浮動小数点数表記以外に何があるか.
floor :: Float -> Integer
floor = read . takeWhile (/= .
) . show
答: floor (-3.1) を評価すると -4 ではなく -3 になる.
Documentation
floorS' :: Float -> Integer Source #
尻高君のアイデアを無理に活かした実装.Numeric モジュールをインポートして showFFloat を使えばなんとなるかな.
floorS' :: Float -> Integer
floorS' x = if "0." == take 2 (reverse s) || 0 < x then r else r-1
where
s = showFFloat Nothing x ""
t = takeWhile (/= .
) s
r = read t
>>>
floorS' (12345678.0 :: Float)
12345678>>>
floorS' (-3.1)
-4>>>
floorS' (-3.0)
-3