【问题标题】:Show a number with specified number of significant digits显示具有指定有效位数的数字
【发布时间】:2011-03-06 04:15:51
【问题描述】:

出于显示目的,我使用以下函数将数字转换为字符串(不要使用科学计数法,不要使用尾随点,按指定舍入):

(* Show Number. Convert to string w/ no trailing dot. Round to the nearest r. *)
Unprotect[Round];   Round[x_,0] := x;   Protect[Round];
shn[x_, r_:0] := StringReplace[
  ToString@NumberForm[Round[N@x,r], ExponentFunction->(Null&)], re@"\\.$"->""]

(注意re 是RegularExpression 的别名。)

多年来,这一直很好地为我服务。 但有时我不想指定要四舍五入的位数,而是想指定一些有效数字。 例如,123.456 应显示为 123.5,但 0.00123456 应显示为 0.001235。

为了真正花哨,我可能想在小数点前后指定有效数字。 例如,我可能希望 .789 显示为 0.8,但 789.0 显示为 789 而不是 800。

对于这类事情,你有一个方便的实用函数,或者对我上面的函数进行概括的建议吗?

相关:Suppressing a trailing "." in numerical output from Mathematica

更新:我试着在这里问这个问题的一般版本:
https://stackoverflow.com/questions/5627185/displaying-numbers-to-non-technical-users

【问题讨论】:

  • 也许我真正想要的是指定一个精度,无论小数点剩下多少位,加上 n。无论我最终使用什么,我都会发布作为答案;希望它对其他人有用。
  • 关于显示n个有效数字:常规的旧NumberForm不做你想要的吗? NumberForm[123.456, 4] 给出 123.5,NumberForm[0.00123456, 4] 给出 0.001235。如果没有,您能否更详细地指定您想要的行为?
  • 关于在“小数点前后”指定有效数字...您能在这里解释一下您想要的确切行为吗,也许还有更多示例?
  • 嗯,NumberForm 不是我想要的,因为我希望 0.1234 显示为 .12,但 1234 显示为 1234,而不是 1200。我想我希望有效数字的数量取决于多少位数是小数点的左边。也许我真正追求的只是“抑制小数点后多余的、过于精确的数字”。
  • 这个怎么样:我想指定 n 位精度,但被限制在 il 和 il+m 之间,其中 il 是整数部分的位数。如果我不希望小数点右侧有超过 2 个有效数字,则 m 可能是 2,如果我想完全删除超过 1000 的数字的小数部分,n 可能是 4。

标签: wolfram-mathematica utilities


【解决方案1】:

dreeves,我想我终于明白你想要什么了,而且你已经得到了,差不多。如果没有,请再次尝试解释我缺少什么。

shn2[x_, r_: 0] := 
 StringReplace[
  ToString@NumberForm[x, r, ExponentFunction -> (Null &)], 
  RegularExpression@"\\.0*$" -> ""]

测试:

shn2[#, 4] & /@ {123.456, 0.00123456}
shn2[#, {3, 1}] & /@ {789.0, 0.789}
shn2[#, {10, 2}] & /@ {0.1234, 1234.}
shn2[#, {4, 1}] & /@ {12.34, 1234.56}

Out[1]= {"123.5", "0.001235"}

Out[2]= {"789", "0.8"}

Out[3]= {"0.12", "1234"}

Out[4]= {"12.3", "1235"}

【讨论】:

  • +1。好的。似乎您删除了一个收到一个赞成票的答案,然后创建了这个新答案。通常最好编辑旧的答案内容,除非在极少数情况下,您想保留两个截然不同的答案。
  • @belisarius 对不起。这是否意味着我删除的答案仍然对所有人可见,而不仅仅是我?是否有我忽略的网站指南列表?另外,有什么方法可以发私信吗?我知道聊天,但这需要用户同时在线。
  • 只有代表点数超过 10K 的人才能看到您删除的答案。您的“聊天联系”可能与this question 有关。至于私人消息,答案很简单:不。指南等是here 和meta 网站一般(内容很多)。
【解决方案2】:

这可能不是完整的答案(您需要从/转换为字符串),但此函数需要一个数字x 和有效数字sig 想要的参数。它保留的位数是sig 的最大值或小数点左边的位数。

A[x_,sig_]:=NumberForm[x, Max[Last[RealDigits[x]], sig]]

RealDigits

【讨论】:

  • 酷,谢谢。我的答案的剪辑部分试图概括这一点。我使用 IntegerLength@IntegerPart 因为 Last@RealDigits 可以是负数。
【解决方案3】:

这是我原来功能的一个可能的概括。 (我已经确定它不等同于巫师先生的解决方案,但我还不确定我认为哪个更好。)

re = RegularExpression;

(* Show Number. Convert to string w/ no trailing dot. Use at most d significant
   figures after the decimal point. Target t significant figures total (clipped 
   to be at least i and at most i+d, where i is the number of digits in integer 
   part of x). *)
shn[x_, d_:5, t_:16] := ToString[x]
shn[x_?NumericQ, d_:5, t_:16] := With[{i= IntegerLength@IntegerPart@x},
  StringReplace[ToString@NumberForm[N@x, Clip[t, {i,i+d}],
                                    ExponentFunction->(Null&)],
                re@"\\.$"->""]]

测试:

这里我们指定 4 位有效数字,但从不将任何数字放在小数点左侧,并且从不使用超过 2 位小数点右侧的有效数字。

(# -> shn[#, 2, 4])& /@ 
  {123456, 1234.4567, 123.456, 12.345, 1.234, 1.0001, 0.123, .0001234}

{  123456 -> "123456", 
 1234.456 -> "1234", 
  123.456 -> "123.5"
   12.345 -> "12.35", 
    1.234 -> "1.23", 
   1.0001 -> "1", 
    0.123 -> "0.12", 
0.0001234 -> "0.00012" }

【讨论】:

  • @MrWizard:假设我希望 12.34 显示为 12.3,但 1234.56 显示为 1235。我基本上是说我希望小数点右侧有 1 位,除非已经有足够的有效数字左边。 (感谢您的帮助!)
  • @dreeves 该案例已正确处理。请参阅我的回答中“测试”下的Out[4]。
  • 啊,对不起,shn2[.000123, {3,2}] 怎么样?我不想将微小的数字显示为零,但也永远不会用零替换小数点左边的有效数字。我相信你的 shn2 不能用相同的参数设置来做这两个?查看我刚刚附加到问题的要求。再次感谢,对于这个非常不恰当的问题,我们深表歉意!
  • @dreeves 抱歉回答错了三遍!我想你现在有你的解决方案了吗?真的需要对Clip 进行修改吗,或者您可以只使用shn[x_?NumericQ, d_: 1*^6, t_: 1*^6],因为我无法想象需要超过一百万位数字吗?
  • @MrWizard:完全是我的错!非常感谢您的帮助。啊,避免修改 Clip 的好主意,尽管我觉得这些修改无论如何都很好。
猜你喜欢
  • 2018-10-09
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多