2017-03-29 12 views
-2

を振る舞う私は次のコードを持っている:デルファイTRUNC妙

function Extenso(nb: real); string; 
var 
    total: real; 
begin 
    total := Trunc(nb); 
    ... 
    Result := ...; 
end; 

この関数にはセントを持っていない国、それゆえTRUNCのために、フルに番号を説明する文字列を返します。

入力のparam NBは(小数点0で、私のエラーの場合)790209.00として入ってくる、不思議なTRUNCの結果は、デバッガ上です。誰かがそれを説明しようとすることができますか?私はDelphi XE3のアップデート2でIDEフィックスパック5.93、Windows 10 Pro 64を使用しています。

編集:質問への回答として、ビジネスルールが含まれています。 、しかし、ダウンではありません。あなたの貢献に感謝@Dsmと@CraigYoung。

+0

のようないくつかの機能を考慮することが必要になることがありますか? 's:= Extenso(790209.0);'上記の結果を出す?そうでなければ、値は「790208.9995」程度であるかもしれませんが、小数点以下2桁で表示すると切り上げられます。 –

+0

http://stackoverflow.com/questions/1398295/trunc-functionとほぼ同じように見えます。 –

+0

説明している内容を再現することはできません。 [mcve]を表示してください。 –

答えて

2

ここではトランケートではなくラウンドを使用する必要があります。実数型では、値はかなり正確ではないので、たとえば790209.00は実際には790208.999999999であり、これを切り捨てると値が表示されます。もちろん、あなたがするたびに何をしたいあなたを与えるいない可能性があります丸め、0.5で終わる値があるかもしれない、とあなたは値が `790209.00`設定されている方法

Trunc(nb + 0.000001); 
+0

値790209は、精度がRealの範囲内にあります。それは正確な整数値として表されます。 –

+0

@RobKennedy:値790209が計算された値でない限り(33.3 * 23730のコメントを参照)、IEEE浮動小数点型では33.3が正確には表現できないため、この値は790208.99となります。 – HeartWare

+0

これは本当にひどいアドバイスです。 '1'に切り捨てることを意図した '1.99999993562'の値は代わりに' 2'を返します。正確なアドバイスは、浮動小数点数学がどのように機能するかの概念をOPに導くことです。さまざまなアプローチの代替案と賛否両論を理解する。怠惰なハックアラウンドについてアドバイスするだけで、根本的に欠陥のある解決策が得られます。 –