Показать номер с указанным количеством значащих цифр - PullRequest
3 голосов
/ 06 марта 2011

Я использую следующую функцию, чтобы преобразовать число в строку для целей отображения (не используйте научную запись, не используйте конечную точку, округленную, как указано):

(* 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.

Чтобы по-настоящему придумать, я мог бы хотеть указать значащие цифры как до, так и после десятичной точки.Например, я бы хотел, чтобы 0,779 отображалось как 0,8, а 789,0 - как 789, а не 800.

У вас есть удобная служебная функция для такого рода вещей или предложения для обобщения моей функции выше?

Похожие: Подавление трейлинга "."в числовом выводе от Mathematica

ОБНОВЛЕНИЕ: Я попытался задать общую версию этого вопроса здесь:
https://stackoverflow.com/questions/5627185/displaying-numbers-to-non-technical-users

Ответы [ 3 ]

5 голосов
/ 06 марта 2011

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 голос
/ 06 марта 2011

Возможно, это не полный ответ (вам нужно преобразовать из / в строку), но эта функция принимает аргументы с номером x и значащие цифры sig. Максимальное количество сохраняемых цифр - sig или количество цифр слева от десятичной дроби.

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

RealDigits

0 голосов
/ 06 марта 2011

Вот возможное обобщение моей первоначальной функции. (Я определил, что это не эквивалентно решению г-на Волшебника, но я пока не уверен, какой вариант мне лучше.)

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" }
...