kalaivanan from Bangalore, India Ответов: 3

Преобразование научных количество обозначение на вещественное число в C#


десятичная сумма;
десятичный.Метод tryparse(ДС.Таблицы[0]. строки[row][col].ToString (), NumberStyles.Любой, CultureInfo.Инвариантная культура, выходное количество);

Я использовал приведенный выше код для преобразования числа научной нотации в действительное число,
Он преобразует 1.09 E+15 в 1090000000000000
но когда я пытаюсь преобразовать 1.09 E+30, он преобразуется в 0.

Пожалуйста, скажите мне, как преобразовать это большее число.

3 Ответов

Рейтинг:
2

phil.o

Система.Десятичная дробь не может представлять такое значение, как 1.09 E+30. Видеть здесь:
Десятичная Структура[^]
Двоичное представление десятичного значения состоит из 1-битного знака, 96-битного целого числа и коэффициента масштабирования, используемого для деления 96-битного целого числа и указания того, какая его часть является десятичной дробью. Масштабный коэффициент-это неявно число 10, возведенное в степень от 0 до 28. Поэтому двоичное представление десятичного значения имеет вид, ((-2^96 - 2^96) / 10^(0-28)), где -(2^96-1) равно MinValue, а 2^96-1 равно MaxValue.

Вы должны использовать систему.Вместо этого двойной.

double amount;
double.TryParse(ds.Tables[0].Rows[row][col].ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out amount);


[Редактировать]
Если вы хотите представить значение по-другому, вы должны написать:
string stringRepresentationOfDoubleValue = amount.ToString("#,##0"); // Or whatever format string you need here

Что касается строк числового формата, пожалуйста, обратитесь к:
Строки Настраиваемых Числовых Форматов [^]
[/Редактировать]


kalaivanan from Bangalore, India

Я попробовал дважды.Метод tryparse(ДС.Таблицы[0]. строки[row][col].ToString (), NumberStyles.Любой, CultureInfo.Инвариантная культура, выходное количество);
он преобразуется 1.09 Е+30 до 1,09 Е+30
Я пытался
двойная сумма = двойная.Синтаксический анализ(ДС.Таблицы[0]. строки[row][col].ToString (), NumberStyles.Поплавок, CultureInfo.Инвариантная культура).Метод toString();
Он преобразовался в 0.
Любой другой тип данных есть, Пожалуйста, скажите мне

phil.o

он преобразовал 1.09 E+30 в 1.09 E+30 =>??

kalaivanan from Bangalore, India

Когда я пытаюсь преобразовать это значение 1.09 E+30, оно возвращает то же самое значение

phil.o

Здесь есть что-то важное, что вы, кажется, упускаете: когда вы читаете 1.09 E+30, это не означает, что компьютер хранит это как строковое значение; то, что вы видите, это представление о реальной ценности, которую компьютер на самом деле хранит и манипулирует. Это просто представляет вы это значение под научной нотацией, просто потому, что 1.09 E+30 гораздо более читабельно, чем 1090000000000000000000000000000.
Ты понимаешь? Преобразовывать нечего, потому что вы путаете значение с его удобочитаемым представлением.
Смотрите мое обновленное решение.

Рейтинг:
2

Zoltán Zörgő

Десятичный[^] не может вместить такое большое число. Попробуй BigInteger[^] вместо.

[Обновление]
Предположим, что числа с плавающей запятой вам не подходят, вам следует поискать пользовательские библиотеки, например BigNumber[^], или GNU BigNum[^].


phil.o

Класс BigInteger содержит целочисленные значения, а не вещественные :)
Хороший выбор-это двойной тип, здесь.

Zoltán Zörgő

Хороший улов. Приведенные примеры выводили меня из себя.

kalaivanan from Bangalore, India

BigInteger доступен только в .NET Framework 4.5
,но я работаю в .NET Framework 3.5, любой другой тип данных должен иметь большее значение.

Zoltán Zörgő

Тоже верно. Чем я предполагаю, что у вас нет встроенного типа для таких больших чисел с фиксированной точкой. Double-это плавающая точка, поэтому она может вам не подойти.

Sergey Alexandrovich Kryukov

5ед.
Кроме того, ОП не понимает, что не существует такого понятия, как "научное обозначение числа".
—СА

Рейтинг:
2

SRKarn

попробуйте это, если возникнут какие-либо проблемы, дайте мне знать..
ToString(doubleVar, System.Глобализация.Числовые стили.Номер)


kalaivanan from Bangalore, India

В .NET Framework 3.5 функция ToString() не принимает никаких параметров

[no name]

Это совершенно неправильно. ToString не может принимать никаких параметров, строковый параметр, параметр IFormatProvider или строку и IFormatProvider.