2017-03-29 32 views
-2

我有以下代碼:德爾福TRUNC行爲出現異常

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

該函數返回描述全數字的字符串,有沒有仙的國家,因此TRUNC。

當輸入PARAM NB進來作爲790209.00(我的錯誤情況下,小數0),奇怪的是TRUNC的結果是在調試器。有人可以試着解釋嗎?!?我在德爾福XE3更新2,與IDE修訂包5.93時,Windows 10 Pro的64

編輯:作爲一個澄清的問題,這裏還涉及到一個業務規則,客戶會接受發到結果,但不失望。感謝@Dsm和@CraigYoung對您的貢獻。

+0

一些函數值'790209.00'如何設置?是否:= Extenso(790209.0);'給出上述結果?如果不是,那麼可能是值爲'790208.9995'左右,但在呈現兩位小數時會舍入。 –

+0

看起來像幾乎一樣http://stackoverflow.com/questions/1398295/trunc-function –

+0

你所描述的不能被複制。顯示[mcve]。 –

回答

2

你需要在這裏使用round而不是trunc。對於真實類型,值並不完全確切,因此790209.00可能確實是790208.999999999,例如,truncing會顯示值。當然,如果你可能有以.5結尾,四捨五入可能不會給你想要的東西,每次一個值,你可能需要考慮像

Trunc(nb + 0.000001); 
+0

790209的值在「Real」的精確範圍內。它被表示爲精確的整數值。 –

+0

@RobKennedy:除非值790209是一個計算值(它是 - 請參閱上面的註釋 - 33.3 * 23730),在這種情況下,值可能非常好,爲790208.99,因爲33.3在IEEE浮點類型中不能精確顯示。 – HeartWare

+0

這是真正可怕的建議。意圖截斷爲「1」的值「1.99999993562」將返回「2」。正確的建議是指導OP瞭解浮點數學運算的概念。瞭解各種方法的選擇和利弊。爲懶散的黑客提供建議只會產生根本上有缺陷的解決方案。 –