<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()。