将数字字符串转换为四舍五入小数(C#)



很抱歉问了这个愚蠢的问题,但我从数据库中得到了这个值

"7.545720553985866E+29"

我需要把这个值转换成十进制,四舍五入到6位。最好的方法是什么?我试过

var test = double.Parse("7.545720553985866E+29");
test = Math.Round(test, 6);
var test2 = Convert.ToDecimal(test);

但是该值保持不变并且转换崩溃。

Math.Round四舍五入到小数点右侧的N位。您的数字在小数点右侧没有数字(相当于754,572,055,398,586,600,000,000,000,000),因此四舍五入不会更改值。

如果你想四舍五入到N有效数字,那么看看一些现有的答案:

将两位数舍入为x个有效数字

将重要数字四舍五入为双位数,而不是小数位数

转换崩溃。

这是因为该值对于decimal来说太大了。decimal可以容纳的最大值是7.9228E+28,您的值大约是这个值的10倍。

也许您可以用子字符串来表示它,然后进行解析。

var test="7.5457250553985866E+29"。基板(0.8);//7.545720

test=数学四轮(test,6);

var test2=Convert.ToDecimal(测试);

您可以使用它四舍五入到6位有效数字:

round(test, 6 - int(math.log10(test)))

由此产生的值是

7.545721e+29

这是通过使用math模块中的log10来获得test中的10的幂,将其四舍五入以获得整数,从6中减去该整数,然后使用round来获得所需的数字。

正如其他人所指出的,round适用于给定的小数位数。log10和其余数字表示需要多少小数位才能获得所需的有效位数。如果小数位数为负数,则round舍入到小数点的左侧。

您应该注意,log10并不完全准确,取其int可能与预期值相差一。这种情况很少发生,但确实会发生。此外,即使计算的值是正确的,将值转换为字符串(例如打印时)也可能会产生与预期不同的结果。如果你需要完美的准确性,你最好从值的字符串表示开始工作。

最新更新