2014-09-09 1 views
1

У меня есть код для удаления конечных нулей из значения перед представлением его в пользовательский интерфейс, однако я обнаружил, что в некоторых случаях вместо удаления нулей он изменяет значение.Неверное значение при преобразовании toString ("G29")

например: 123,400000000000000000 становится 123.40000000000001

код я использую:

string value = "123.400000000000000000"; 
value = double.Parse(value).ToString("G29"); 

Кто-нибудь знает, почему это происходит, и как я могу изменить мой код, чтобы он показывает «123,4» вместо этого.

ответ

1

Это потому, что вы превращаете его в double, и, поскольку все, кто потратил время на вычисления значений с плавающей запятой, будут знать, значения двойной точности не являются бесконечными прецизионными значениями. Выбранное значение находится как можно ближе к тому, что вы предоставляете, но это не всегда то, что вы хотите.

Если у вас есть строка числовой стиль, который вы хотите раздеться конечные нули от, почему вы не просто раздеть конечные нули от него, что-то вроде:

if (s.Contains(".")) { 
    Regex regex = new Regex("\\.?0*$"); 
    s = regex.Replace(s,""); 
} 

чек для . чтобы убедиться, что вы не отделяете нулевые нули от числа, например 1000. Как только вы узнаете, что там есть десятичная точка, нули (и сама десятичная точка, если это - все нули после этого), могут быть уничтожены безнаказанно. Вы можете увидеть его в действии в следующей полной программе консоли:

using System; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static string StripZ(string s) 
     { 
      if (s.Contains(".")) 
      { 
       Regex regex = new Regex("\\.?0*$"); 
       s = regex.Replace(s, ""); 
      } 
      return s; 
     } 

     static void Main(string[] args) 
     { 
      Console.WriteLine(StripZ("123.400")); 
      Console.WriteLine(StripZ("3.0")); 
      Console.WriteLine(StripZ("7.")); 
      Console.WriteLine(StripZ("1000")); 
      Console.ReadLine(); 
     } 
    } 
} 

Выход этой программы:

123.4 
3 
7 
1000 
+0

Спасибо за это, все ответы были действительно полезны, чтобы понять проблему и как способ продвижения вперед. Будет использовать регулярное выражение pax для форматирования моих чисел. –

+0

@ user2776472 Это хороший ответ, и я думаю, вы должны его принять –

1

Проблема заключается в том, что 123.4 не точно представима в типе точечных данных двоичных плавающим , closest double precision value является:

123.40000 00000 00005 68434 18860 80801 48696 89941 40625 

метод ToString округления, что

123.40000 00000 0001 

Вы должны использовать десятичного типа данных вместо типа двоичных данных. Например:

string value = "123.400000000000000000"; 
value = decimal.Parse(value).ToString("G29"); 

Однако, если вы на самом деле, начиная со строки, и просто хотите обрезать завершающие нули, то возможно, было бы более разумным, чтобы сделать это с помощью обработки текста.

Смежные вопросы