将小数格式化为没有科学记数法的小数位数
Posted
技术标签:
【中文标题】将小数格式化为没有科学记数法的小数位数【英文标题】:Format decimal to number of decimal places without scientific notation 【发布时间】:2015-09-16 06:11:15 【问题描述】:我目前正在使用代码格式化双精度:
myDouble.ToString("g4");
获取前 4 位小数。但是,我发现如果数字非常大或非常小,这通常会切换到科学记数法。在 C# 中是否有一个简单的格式字符串,只有前四位小数,或者如果它太小而无法在该位数中表示,则为零?
例如,我想:
1000 => 1000
0.1234567 => 0.1235
123456 => 123456 (Note: Not scientific notation)
0.000001234 => 0 (Note: Not scientific notation)
【问题讨论】:
您的示例没有显示获得前 4 个有效数字 - 这将给出 0.000001234 作为最终结果,而 123500 作为前一个结果。另请注意,格式字符串会四舍五入,因此当以 4 位有效数字表示 0.1234567 时,您最终会得到 0.1235。此外,您的标题指的是十进制,但您的文本指的是双精度 - 是什么? @JonSkeet - 谢谢,很好。我实际上正在以这种方式格式化双精度和浮点数。需要四舍五入 - 这是我的疏忽,我没有在示例中包含它。 您的问题和接受的答案不匹配。您想要“4 位有效数字”还是最多 4 位小数?接受的答案是后者。 @kjbartel - 我已经编辑了问题文本。 【参考方案1】:你可以这样试试:
0.1234567.ToString("0.####")
同时检查Custom Numeric Format Strings
#
如果是,则将“#”符号替换为相应的数字 展示;否则,结果字符串中不会出现数字。
正如 Jon 正确指出的那样,它将对您的数字进行四舍五入。见注释部分
舍入和定点格式字符串
对于定点格式字符串 (即不包含科学记数法的格式字符串 格式字符),数字四舍五入到小数位数 小数点右边有数字占位符。
【讨论】:
【参考方案2】:使用 String.Format() 方法。
String.Format("0:0.####", 123.4567123); //output: 123.4567
注意:# 的数量表示 最大 小数点后所需的位数。
【讨论】:
【参考方案3】:我同意kjbartel 的评论。 我想要的正是原始问题所问的。但他的问题有点模棱两可。
### 格式的问题在于,如果一个数字可以表示或不能表示,它会填满插槽。 因此,它完成了原始问题所要求的一些数字,而不是其他数字。
我的基本需求是,这是一个很常见的需求,如果数字很大,我不需要显示小数位。如果数字很小,我确实想显示小数位。基本上是 X 个有效数字。
“Gn”格式会处理有效数字,但如果超过位数,它会切换为科学记数法。我永远不需要 E 符号(与问题相同)。
所以我使用了固定格式(“Fn”),但我根据数字的“大”程度即时计算宽度。
var myFloatNumber = 123.4567;
var digits = (int) Math.Log10(myFloatNumber);
var maxDecimalplaces = 3;
var format = "F" + Math.Max(0,(maxDecimalplaces - digits));
我发誓有一种方法可以在 C++(Visual Studio Flavor)中以 teh 格式声明或在 C# 中执行此操作,也许有,但我找不到。
所以我想出了这个。我也可以转换为字符串并测量小数点前的长度。但是把它转换成字符串两次感觉不对。
【讨论】:
以上是关于将小数格式化为没有科学记数法的小数位数的主要内容,如果未能解决你的问题,请参考以下文章
R语言sprintf函数:sprintf函数格式化小数位数(数值数据前后整体占位个数)将数字输入与非数字输入组合起来控制科学计数法控制小数零的个数多输入数据的格式化
js取整,保留小数位数、四舍五入、科学记数法及去掉数字末尾多余的0