Wolfram mathematica 显示具有指定有效位数的数字
我使用以下函数将数字转换为字符串以便于显示(不要使用科学记数法,不要使用尾随点,按规定进行舍入): (请注意,Wolfram mathematica 显示具有指定有效位数的数字,wolfram-mathematica,utilities,Wolfram Mathematica,Utilities,我使用以下函数将数字转换为字符串以便于显示(不要使用科学记数法,不要使用尾随点,按规定进行舍入): (请注意,re是RegularExpression的别名) 这几年来一直在为我服务。 但有时我不想指定要舍入的位数,而是想指定一些有效数字。 例如,123.456应显示为123.5,但0.00123456应显示为0.001235 为了让人觉得有趣,我可能想指定小数点前后的有效数字。 例如,我可能希望.789显示为0.8,但789.0显示为789而不是800 对于这类事情,你有没有一个方便的实用函数
re
是RegularExpression
的别名)
这几年来一直在为我服务。
但有时我不想指定要舍入的位数,而是想指定一些有效数字。
例如,123.456应显示为123.5,但0.00123456应显示为0.001235
为了让人觉得有趣,我可能想指定小数点前后的有效数字。
例如,我可能希望.789显示为0.8,但789.0显示为789而不是800
对于这类事情,你有没有一个方便的实用函数,或者是对我上面的函数进行推广的建议
相关的:
更新:我试着在这里问这个问题的一般版本:这可能不是完整的答案(您需要将字符串从/转换为字符串),但此函数接受参数一个数字
x
和所需的有效数字sig
。它保留的位数为sig
的最大值或小数点左边的位数
A[x_,sig_]:=NumberForm[x, Max[Last[RealDigits[x]], sig]]
德雷夫斯,我想我终于明白你想要什么了,而且你已经差不多明白了。如果没有,请再次尝试解释我遗漏了什么
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"}
这是我原始函数的一个可能的推广。 (我已经确定它不等同于Wizard先生的解决方案,但我还不确定我认为哪个更好。) 测试: 在这里,我们指定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" }
也许我真正想要的是指定一个精度,即小数点的剩余位数加上n。无论我最终使用什么,我都会将其作为答案发布;希望它对其他人有用。关于显示n个重要数字:常规的旧数字格式不符合你的要求吗?数字形式[123.456,4]给出123.5,数字形式[0.00123456,4]给出0.001235。如果没有,您能更详细地指定您想要的行为吗?关于指定有效数字“小数点之前和之后”。。。你能在这里解释一下你想要的确切行为吗,也许再举一些例子?嗯,NumberForm不是我想要的,因为我希望0.1234显示为.12,但1234显示为1234,而不是1200。我想我希望有效数字的数量取决于小数点的剩余位数。也许我真正想要的只是“抑制小数点后多余的、过于精确的数字”。这样如何:我想指定n个精度数字,但被剪裁为介于il和il+m之间,其中il是整数部分的位数。如果我不希望小数点右边有超过2个有效数字,那么m可能是2;如果我希望删除1000以上数字的小数部分,那么n可能是4。@MrWizard:假设我希望12.34显示为12.3,但1234.56显示为1235。我基本上是说,我想要小数点右边有一个数字,除非左边已经有足够的有效数字。(感谢您的帮助!)@dreeves该案件处理正确。请参阅我答案中“测试”下的
Out[4]
。啊,对不起,shn2[.000123,{3,2}]怎么样?我不想将微小的数字显示为零,也不想将小数点左边的有效数字替换为零。我相信你的shn2不能用相同的参数设置同时做这两件事?看看我刚才附加在问题后面的要求。再次感谢,并为这个非常不恰当的问题感到抱歉@德雷夫很抱歉回答了三次错误的问题!我想你现在有解决办法了吧?是否真的需要修改Clip
,或者你可以直接使用shn[x_u?NumericQ,d_∶1*^6,t_∶1*^6]
,因为我无法想象需要超过一百万位数字?@MrWizard:完全是我的错!非常感谢你的帮助。啊,避免对剪辑进行修改是个好主意,尽管我认为这些修改无论如何都是好的。+1。美好的您似乎删除了一个获得一票的答案,然后创建了这个新答案。通常最好编辑旧的答案内容,除非很少,当你想保留两个完全不同的答案时。@belisarius抱歉。这是否意味着我删除的答案仍然对每个人可见,而不仅仅是我?是否有我忽略的网站指南列表?还有,有没有办法发送私人信息?我知道聊天,但这需要用户同时在线。你删除的答案仅对代表积分超过10000的人可见。您的“聊天联系人”可能与。至于私人信息,答案很简单:不。指南等一般都在网站上(很多内容)。很酷,谢谢。我的答案的剪辑部分试图概括一下这一点。我曾经IntegerLength@IntegerPart因为Last@RealDigits可能是负面的。
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@"\\.$"->""]]
(# -> 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" }