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

时间:2019-02-11 16:13:13

标签: c# math

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

"7.545720553985866E+29"

我需要将此值转换为十进制数,四舍五入为6位数字。最好的方法是什么?我尝试过

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

但该值保持不变,并且转换失败。

3 个答案:

答案 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模块中的mathtest中获得10的幂,将其四舍五入以获得整数,从6中减去它然后使用{{1 }}以获取所需的数字。

正如其他人所指出的,round可以工作到给定的小数位数。 round和其余的数字需要多少位数才能获得所需的有效数字位数。如果小数位为负,则log10会四舍五入到小数点的左侧。

您应注意,round并非十分准确,将其中的log10与预期值相差一倍。这种情况很少发生,但是确实发生。另外,即使计算出的值正确,将值转换为字符串(例如在打印时)也可能会得到与预期不同的结果。如果需要完美的准确性,最好使用值的字符串表示形式。