我需要将一个数字截断到2位小数,这基本上意味着要删除多余的数字.
例如:
2.919 -> 2.91
2.91111 -> 2.91
Run Code Online (Sandbox Code Playgroud)
为什么?这是SQL Server在存储多个特定精度时正在执行的操作.例如,如果列是十进制(8,2),并且您尝试插入/更新9.1234的数字,则将切断3和4.
我需要在c#代码中做同样的事情.
我能想到的唯一可能的方法是:
使用stringformatter将其"打印"出两个小数位,然后将其转换为小数,例如:
decimal tooManyDigits = 2.1345
decimal ShorterDigits = Convert.ToDecimal(tooManyDigits.ToString("0.##"));
// ShorterDigits is now 2.13
Run Code Online (Sandbox Code Playgroud)
我对此不满意,因为它涉及到一个字符串,然后是另一个字符串到十进制转换,这看起来有点疯狂.
使用Math.Truncate(只接受一个整数),所以我可以将它乘以100,截断它,然后除以100.例如:
decimal tooLongDecimal = 2.1235;
tooLongDecimal = Math.Truncate(tooLongDecimal * 100) / 100;
Run Code Online (Sandbox Code Playgroud)
我对此也不满意,因为如果tooLongDecimal为0,我将得到除以0的错误.
当然有更好的+更简单的方法!有什么建议?
我对cobol中的计算函数的舍入感到困惑.
宣言:
VAR-A PIC S9(9)V99 COMP-3.
VAR-B PIC S9(9)V9(6) COMP-3.
Run Code Online (Sandbox Code Playgroud)
程序.
MOVE +12.08 TO VAR-A.
MOVE +6.181657 TO VAR-B.
COMPUTE VAR-A ROUNDED = VAR-A + VAR-B.
Run Code Online (Sandbox Code Playgroud)
VAR-A的结果是18.27还是18.26?cobol会对计算做什么?它会将VAR-B首先舍入到VAR-A中指定的小数位,还是将cobol添加2个变量然后将它们四舍五入到VAR-A中指定的小数位?
任何帮助将不胜感激.
@NealB,
这个例子怎么样:
宣言:
01 VAR-ARRAY OCCURS 22 TIMES.
03 VAR-A PIC S9(9)V9(6) COMP-3.
01 VAR-B PIC S9(9)V99 COMP-3.
Run Code Online (Sandbox Code Playgroud)
假设VAR-A是一个数组,其值如下:
VAR-A(01) = 123.164612
VAR-A(02) = 12.07865
VAR-A(03) = 6.181657
VAR-A(04) = 1.744353
VAR-A(05) = 6.118182
VAR-A(06) = 1.744353
VAR-A(07) = 6.158715
VAR-A(08) = 1.744353
VAR-A(09) = 6.194759
VAR-A(10) = 1.744353
VAR-A(11) = 3.037896 …Run Code Online (Sandbox Code Playgroud)