很抱歉问了这个愚蠢的问题,但我从数据库中得到了这个值
"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
可能与预期值相差一。这种情况很少发生,但确实会发生。此外,即使计算的值是正确的,将值转换为字符串(例如打印时)也可能会产生与预期不同的结果。如果你需要完美的准确性,你最好从值的字符串表示开始工作。