2015-09-03 2 views
-1

Я хочу преобразовать двойную строку в строку и отображать только десятичные числа.Показать только необходимые десятичные знаки из double

Так что я не могу использовать

d := 123.4 
s := Format('%.2f', [d]); 

Как отобразить в качестве результата 123,40, когда я хочу 123,4.

Вот таблица образцов и ожидаемый результат

|Double|Result as string| 
------------------------- 
|5  |5    | 
|5.1 |5.1    | 
|5.12 |5.12   | 
|5.123 |5.123   | 
+0

Вы хотите удалить нули, если они присутствуют в конце строки? –

+0

Да, я бы хотел –

ответ

2

Вы можете использовать %gformat string:

Общие: Аргумент должен быть значение с плавающей точкой. Значение преобразуется в кратчайшую возможную десятичную строку с использованием фиксированного или научного формата. Количество значащих цифр в полученной строке задается спецификатором точности в строке формата; a Предполагаемая по умолчанию точность 15 принимается, если нет спецификатора точности . Конечные нули удаляются из результирующей строки, а десятичная точка появляется только при необходимости. Полученная строка использует формат фиксированной точки , если число цифр слева от десятичной цифры указывает на значение меньше или равно указанной точности, и если значение больше или равно 0,00001. В противном случае итоговая строка использует научный формат.

+0

Отлично, спасибо! –

+0

Попробуйте это с помощью 'const d: Double = 0.1000000000000001;' –

2

Это не так просто, как вы думаете. Все это сводится к представительности.

Рассмотрим простой пример 0.1. Это значение точно не представлено в double. Это связано с тем, что double является двоичным, а не десятичным Представление.

значение А double хранится в виде s*2^e, где s и e являются мантисса и экспоненты, соответственно, оба целые числа.

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

0.10000 00000 00000 00555 11151 23125 78270 21181 58340 45410 15625 

Если это приходит в шок, я предлагаю следующие ссылки:

Итак, что делать? Очевидным вариантом является переход на десятичное, а не двоичное представление. В Delphi, который обычно означает использование типа Currency. В зависимости от вашего приложения, которое может быть хорошим выбором, или это может быть ужасным выбором.Например, если вы хотите эффективно выполнять научные или инженерные расчеты, то десятичный тип не подходит.

Другой вариант - посмотреть, как это работает с Python. Функция repr означает, где это возможно, чтобы получить строку со свойством, которое eval(repr(x)) == x. В старых версиях Python repr производились очень длинные строки формы 1.1000000000000001, когда на самом деле 1.1 было бы достаточно. Python adopted an algorithm, который находит кратчайшее десятичное выражение, представляющее значение с плавающей запятой. Вы могли бы применить тот же подход. Проблема в том, что алгоритм очень сложный.

+0

Да, я знаю об этой проблеме. Но в моем случае% g работает нормально. –

+0

Не всегда это не так. Не для всех возможных значений. –

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