<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我有這個腳本可以進行簡單的計算並在窗口中顯示結果:
小計 = 100.05 ;
折扣百分比 = 0.1 ;
折扣金額 = 小計 * 折扣百分比;
totalBeforeTax = 小計 - discountAmount;
格式化消息 =連續(
“小計:” ,重複( “” , 5個),格式(小計, “貨幣” ), "\!n" ,
“折扣百分比:” ,重複( “” , 5個),格式(折扣百分比, “百分” ), "\!n" ,
“優惠金額:” ,重複( “” , 5個),格式(折扣金額, “貨幣” ), "\!n" ,
“稅前總額:” ,重複( “” , 5個),格式(稅前總額, “貨幣” ), "\!n"
);
格式化消息顯示 =新窗戶( “結果” ,
陣容箱( N 列( 1個), 間距( 0 , 0 ),邊框框(左邊( 20 ),正確的( 20 ), 頂部( 20 ), 底部( 20 ),
文本框( 格式化消息, <<設置字體大小( 14 ) ) )
),
展示(小計、discountAmount、totalBeforeTax)
);
它在日誌和輸出窗口中產生以下內容:



所以使用格式(稅前總額, “貨幣” ),結果totalBeforeTax 被“四捨五入”。 我可以想到多種處理方法,但想知道最推薦的方法是什麼。
目前沒有 Big Number 計劃。StackOverflow 鏈接中提出了很多有趣的觀點。根據您將如何處理這些數字,不同的解決方案可能是合適的。
克雷奇
謝謝 Craige,事實上我一直在考慮構建一個接口以允許 JMP 訪問 java 的 BigDecimal 類。 是否有任何計劃將其作為一種類型包含在下一版本的 JMP 中?
您可能希望對 discountAmount 計算進行舍入/下限/上限。Round 有第二個參數,對於小數點後的數字,您可能希望將其設置為 2。地板和天花板需要類似 floor(x*100)/100 的東西才能得到類似的結果。
小計 = 100.05;
折扣百分比 = 0.1;
折扣金額 =圓形的(小計 * 折扣百分比, 2) ;
totalBeforeTax = 小計 - discountAmount;
顯示(discountAmount,totalBeforeTax);
折扣金額 = 10.01;
totalBeforeTax = 90.04;
原始代碼中的 format 函數處於向上或向下舍入的邊緣,將 0.005 四捨五入到兩個位置。演示文稿中的差異是由在一種情況下具有負值而在另一種情況下具有加號的值觸發的...兩個值都向上舍入,但其中一個在計算中具有負 discountAmount。
JMP 中使用的浮點數將 0.01 之類的數字表示為截斷的重複二進制小數。就像 1/3 不完全是 0.333333333333 一樣,內部表示也不精確(二進制小數除外,如 1/2、1/4、1/8 等)。如果您將 100 便士加起來,表示為 0.01,您將得到一個非常接近 1.00 的數字,但在小數點後 16 位不同。這個非常微小的錯誤一直讓會計包選擇另一種表示: java - 為什麼不使用 Double 或 Float 來表示貨幣? - 堆棧溢出
總計 = 0;
對於( i = 1, i <= 100, i++, total += .01 );
顯示(格式(總計,“固定”,20,16));
格式(總計,“固定”,20、16)=“1.0000000000000007”;
嗨,吉姆,
謝謝你的回复。 因此,Floor 和 Ceiling 四捨五入到最接近的整數。 Format (x, "Currency") 基本上似乎使用 Round(x,2)。 人們會認為“貨幣”格式會採用截斷方法而不是四捨五入。
我不做很多財務報告,但是,當我需要擔心舍入誤差時,我只使用函數 Round()、Ceiling() 和 Floor()。