繁体   English   中英

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

[英]Convert a number string to a rounded decimal (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+287.9228E+28 - 您的值大约是7.9228E+28值的10倍。

也许你可以将其子串,然后解析。

var test =“7.545720553985866E + 29”.Substring(0,8); // 7.545720

test = Math.Round(test,6);

var test2 = Convert.ToDecimal(test);

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

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

从中得到的值是

7.545721e+29

这可以通过使用math模块中的log10来获得test的10的幂,将其向下round以获得整数,从6减去然后使用round来获得所需的数字。

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

您应该知道log10不是完全准确的,并且取其中的int可能会偏离预期值1。 这很少发生,但确实发生了。 此外,即使计算值正确,将值转换为字符串(例如打印时)也可能会产生与预期不同的结果。 如果您需要完美的准确性,那么最好使用值的字符串表示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM