抱歉,这个问题很愚蠢,但是我从数据库中得到了这个值
"7.545720553985866E+29"
我需要将此值转换为十进制数,四舍五入为6位数字。最好的方法是什么?我尝试过
var test = double.Parse("7.545720553985866E+29");
test = Math.Round(test, 6);
var test2 = Convert.ToDecimal(test);
但该值保持不变,并且转换失败。
答案 0 :(得分:3)
Math.Round
四舍五入到小数点右边的N个数字 。您的数字在小数点右边没有数字(相当于754,572,055,398,586,600,000,000,000,000
),因此四舍五入不会改变值。
如果要四舍五入到N个有效数字,请查看一些现有答案:
Round a double to x significant figures
Rounding the SIGNIFICANT digits in a double, not to decimal places
转换失败。
那是因为该值对于decimal
而言太大。 decimal
可以容纳的最大值是7.9228E+28
-您的值大约是该值的10倍。
答案 1 :(得分:0)
也许您可以对其进行子字符串化,然后再进行解析。
var test =“ 7.545720553985866E + 29” .Substring(0,8); // 7.545720
test = Math.Round(test,6);
var test2 = Convert.ToDecimal(test);
答案 2 :(得分:0)
您可以使用此舍入到6位有效数字:
round(test, 6 - int(math.log10(test)))
从中得到的值是
7.545721e+29
通过使用log10
模块中的math
在test
中获得10的幂,将其四舍五入以获得整数,从6中减去它然后使用{{1 }}以获取所需的数字。
正如其他人所指出的,round
可以工作到给定的小数位数。 round
和其余的数字需要多少位数才能获得所需的有效数字位数。如果小数位为负,则log10
会四舍五入到小数点的左侧。
您应注意,round
并非十分准确,将其中的log10
与预期值相差一倍。这种情况很少发生,但是确实发生。另外,即使计算出的值正确,将值转换为字符串(例如在打印时)也可能会得到与预期不同的结果。如果需要完美的准确性,最好使用值的字符串表示形式。