2016-05-03 7 views
-2

に科学的表記法を回避する方法:Haskellは - 私は、例えば、印刷される100による番号のリストを分割する必要が小数出力

map (/100) [29, 3, 12] 

生成:

しかし
[0.29,3.0e-2,0.12] 

Iが必要です。

[0.29,0.03,0.12] 

ハスケルでこれを行うにはどうすればよいですか?任意のアイデアは本当に感謝します

+0

3.0e-2は0.03に相当します。それらは同じ番号です。あなたはこれらの数字や他のものを完全に印刷することについて話していますか? –

+0

私は3.0e-2が0.03に相当することを知っています。私は印刷のためにもっと普通のフォームが必要です。 (私が質問をするたびに印を付けて、誰かに怒らせるのですか?) –

+0

それはフォーマット上の問題です( 'Text.Printf.printf'で処理されます)。あなたの質問のスコアについて:タイトルと内容がまったく一致しません。より良いタイトルは、「特定の形式で小数を表示する方法」または「小数出力で科学的表記を避ける方法」です。 – Zeta

答えて

4

0.03および3.0e-2は同じ番号です。内部的には、GHCはshowFloatを使用してそれを印刷します。その結果、絶対値が0.1と9,999,999の範囲外にあるときに科学的表記が行われます。

Therforeは、あなたがNumericからText.PrintfまたはshowFFloatからprintfで、たとえば、値を自分で印刷することがあります。

import Numeric 

showFullPrecision :: Double -> String 
showFullPrecision x = showFFloat Nothing x "" 

main = putStrLn (showFullPrecision 0.03) 

ご希望の出力に応じて、いくつかのより多くの機能を記述する必要があります。

0

あなたのコメントをお寄せいただきありがとうございます。私は回避策を使用しても問題はないことを理解しています。このコードは、各セクションが始まる時間に基づいて、1分28秒間1.28の形式で音楽のセクションの長さを見つけることでした。結果は文字列としてのタイミングを持つリストですが、それは問題ではありません。興味のある人は、回避策のある関数を次に示します。

subtractMinutes :: RealFrac a => [a] -> [[Char]] 
subtractMinutes (x:xs) = take (length (xs)) (zz : subtractMinutes xs) 
    where ya = (head(xs) - x) * 100 
      ys = truncate (head(xs)) - truncate(x) 
      yz = ya - (fromIntegral(ys) * 40) 
      yx = round(yz) 
      za = div yx 60 
      zs = mod yx 60 
      zz = show(za) ++ "." ++ zx 
      zx = if zs < 10 then "0" ++ show(zs) else show(zs) 
+0

なぜ 'take(length(xs))'?これは最後の要素を削除します。 – Zeta

+0

こんにちはゼータ、私が現在取り組んでいる音楽は、0.00 - 1.12 - 2.38 - 3.40で始まり、5.28(分秒)で終わる4つのセクションを持ち、[1.12 "、" 1.26 "、" 1.02 " 1.48 "]。 4つのセクションの機能には5つの要素が必要です。 –

関連する問題