Форматирование удваивается для вывода в C#

Используйте пробел свойства CSS: nowrap и переполнение: скрытый на Вашем td.

Обновление

Просто видело Ваш комментарий, не уверенный, что я думал, я сделал это так много раз, я забыл, как я делаю это. Это - подход, который работает хорошо в большинстве браузеров для меня... вместо того, чтобы пытаться ограничить td, я использую отделение в td, который обработает экземпляр переполнения. Это имеет хороший побочный эффект способности добавить Ваше дополнение, поля, цвета фона, и т.д. Вашему отделению вместо того, чтобы пытаться разработать td.






Column 1Column 2
this is the text in column one which wraps
this is the column two test

В качестве награды, IE поместит замещающий знак в случае переполнения с помощью определенного для браузера текстового-overflow:ellipsis стиля. Существует путь к , делают то же в FireFox автоматически также, но я не протестировал его сам.

Обновление 2

я начал использовать этот код усечения Justin Maxwell в течение нескольких месяцев теперь, который работает правильно в FireFox также.

62
задан Community 23 May 2017 в 12:10
поделиться

7 ответов

Если вы используете SQL Server, вы можете добавить в свою таблицу три вычисляемых поля:

Sales (saleID INT, amount INT, created DATETIME)

ALTER TABLE dbo.Sales
  ADD SaleYear AS YEAR(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleMonth AS MONTH(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleDay AS DAY(Created) PERSISTED

, и теперь вы можете легко группировать, упорядочивать и т. Д. По дню, месяцу или году распродажа:

SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay

Эти вычисляемые поля всегда будут обновляться (при изменении даты "Создано"), они являются частью вашей таблицы, их можно использовать так же, как обычные поля, и их можно даже индексировать (если они "НАСТОЯЩИЕ") - отличная функция, которая совершенно не используется, ИМХО.

Marc

но вы можете сделать это самостоятельно, выделив внутреннее двоичное число и перестроив его как строковое представление десятичного значения.

В качестве альтернативы вы можете использовать класс Джона Скита DoubleConverter (связанный с из его «Двоичные числа с плавающей запятой и .NET» ). Здесь есть метод ToExactString , который возвращает точное десятичное значение double . Вы можете легко изменить это, чтобы включить округление вывода до определенной точности.

double i = 10 * 0.69;
Console.WriteLine(DoubleConverter.ToExactString(i));
Console.WriteLine(DoubleConverter.ToExactString(6.9 - i));
Console.WriteLine(DoubleConverter.ToExactString(6.9));

// 6.89999999999999946709294817992486059665679931640625
// 0.00000000000000088817841970012523233890533447265625
// 6.9000000000000003552713678800500929355621337890625
61
ответ дан 24 November 2019 в 16:48
поделиться

Взгляните на эту ссылку MSDN . В примечаниях указано, что числа округлены до количества запрошенных десятичных разрядов.

Если вместо этого вы используете "{0: R}", он выдаст то, что называется "двусторонним" значением, взгляните в этой ссылке MSDN для получения дополнительной информации, вот мой код и результат:

double d = 10 * 0.69;
Console.WriteLine("  {0:R}", d);
Console.WriteLine("+ {0:F20}", 6.9 - d);
Console.WriteLine("= {0:F20}", 6.9);

output

  6.8999999999999995
+ 0.00000000000000088818
= 6.90000000000000000000
8
ответ дан 24 November 2019 в 16:48
поделиться

Используйте

Console.WriteLine(String.Format("  {0:G17}", i));

Это даст вам все 17 цифр, которые у него есть. По умолчанию значение Double содержит 15 десятичных цифр точности, хотя внутри поддерживается максимум 17 цифр. {0: R} не всегда дает вам 17 цифр, он дает 15, если число может быть представлено с такой точностью.

возвращает 15 цифр, если число может быть представлено с такой точностью, или 17 цифр, если число может быть только быть представленным с максимальной точностью. Вы ничего не можете сделать, чтобы двойной возврат больше цифр, как это реализовано. Если вам это не нравится, создайте новый двойной класс самостоятельно ...

Двойной класс .NET не может хранить больше цифр, чем 17, поэтому вы не увидите 6.89999999999999946709 в отладчике, вы увидите 6.8999999999999995. Пожалуйста, предоставьте изображение, чтобы доказать, что мы неправы.

хотя внутри поддерживается максимум 17 цифр. {0: R} не всегда дает вам 17 цифр, он дает 15, если число может быть представлено с такой точностью.

возвращает 15 цифр, если число может быть представлено с такой точностью, или 17 цифр, если число может быть только быть представленным с максимальной точностью. Вы ничего не можете сделать, чтобы двойной возврат больше цифр, как это реализовано. Если вам это не нравится, создайте новый двойной класс самостоятельно ...

Двойной класс .NET не может хранить больше цифр, чем 17, поэтому вы не увидите 6.89999999999999946709 в отладчике, вы увидите 6.8999999999999995. Пожалуйста, предоставьте изображение, чтобы доказать, что мы неправы.

хотя внутри поддерживается максимум 17 цифр. {0: R} не всегда даст вам 17 цифр, он даст 15, если число может быть представлено с такой точностью.

которое возвращает 15 цифр, если число может быть представлено с такой точностью, или 17 цифр, если число может быть только быть представленным с максимальной точностью. Вы ничего не можете сделать, чтобы двойной возврат больше цифр, как это реализовано. Если вам это не нравится, создайте новый двойной класс самостоятельно ...

Двойной класс .NET не может хранить больше цифр, чем 17, поэтому вы не увидите 6.89999999999999946709 в отладчике, вы увидите 6.8999999999999995. Пожалуйста, предоставьте изображение, чтобы доказать, что мы неправы.

, который возвращает 15 цифр, если число может быть представлено с такой точностью, или 17 цифр, если число может быть представлено только с максимальной точностью. Вы ничего не можете сделать, чтобы двойной возврат больше цифр, как это реализовано. Если вам это не нравится, создайте новый двойной класс самостоятельно ...

Двойной класс .NET не может хранить больше цифр, чем 17, поэтому вы не увидите 6.89999999999999946709 в отладчике, вы увидите 6.8999999999999995. Пожалуйста, предоставьте изображение, чтобы доказать, что мы неправы.

, который возвращает 15 цифр, если число может быть представлено с такой точностью, или 17 цифр, если число может быть представлено только с максимальной точностью. Вы ничего не можете сделать, чтобы двойной возврат больше цифр, как это реализовано. Если вам это не нравится, создайте новый двойной класс самостоятельно ...

Двойной класс .NET не может хранить больше цифр, чем 17, поэтому вы не увидите 6.89999999999999946709 в отладчике, вы увидите 6.8999999999999995. Пожалуйста, предоставьте изображение, чтобы доказать, что мы неправы.

Мне нравится, что он сам создает новый двойной класс ...

Двойной класс .NET не может хранить больше цифр, чем 17, поэтому вы не увидите 6.89999999999999946709 в отладчике, вы увидите 6.8999999999999995. Пожалуйста, предоставьте изображение, чтобы доказать, что мы неправы.

Мне нравится, что он сам создает новый двойной класс ...

Двойной класс .NET не может хранить больше цифр, чем 17, поэтому вы не увидите 6.89999999999999946709 в отладчике, вы увидите 6.8999999999999995. Пожалуйста, предоставьте изображение, чтобы доказать, что мы неправы.

4
ответ дан 24 November 2019 в 16:48
поделиться

Хотя этот вопрос пока закрыт, я считаю, что стоит упомянуть, как возникло это злодеяние. В каком-то смысле вы можете обвинить спецификацию C #, в которой указано, что двойное значение должно иметь точность 15 или 16 цифр (результат IEEE-754). Немного дальше (раздел 4.1.6) сказано, что реализациям разрешено использовать более высокую точность. Обратите внимание: выше , не ниже. Им даже разрешено отклоняться от IEEE-754: выражения типа x * y / z , где x * y дадут +/- INF , но будут находиться в допустимом диапазоне после деления, не должно приводить к ошибке. Эта функция упрощает компиляторам использование более высокой точности в архитектурах, где это дает лучшую производительность.

Но я пообещал «причину». удобный для отображения и круглые, мы разбираем число используя 15 цифр, а затем определите, он возвращается к одному и тому же значению. Если это так, мы преобразовываем это ЧИСЛО в строка, иначе мы повторно обрабатываем, используя 17 0 .

Этот 15-значный барьер жестко запрограммирован и может быть изменен только путем перекомпиляции интерфейса командной строки, использования Mono или звонка в Microsoft, чтобы убедить их добавить параметр для печати полностью » точность »(это не совсем точность, но из-за отсутствия лучшего слова). Вероятно, проще просто вычислить точность в 52 бита самостоятельно или использовать упомянутую ранее библиотеку.

РЕДАКТИРОВАТЬ: если вы хотите поэкспериментировать с плавающей точкой IEE-754, рассмотрите этот онлайн-инструмент , который показывает вам все соответствующие части с плавающей запятой.

но из-за отсутствия лучшего слова). Вероятно, проще просто вычислить точность в 52 бита самостоятельно или использовать упомянутую ранее библиотеку.

РЕДАКТИРОВАТЬ: если вы хотите поэкспериментировать с плавающей запятой IEE-754, рассмотрите этот онлайн-инструмент , который показывает вам все соответствующие части с плавающей запятой.

но из-за отсутствия лучшего слова). Вероятно, проще просто вычислить точность в 52 бита самостоятельно или использовать упомянутую ранее библиотеку.

РЕДАКТИРОВАТЬ: если вы хотите поэкспериментировать с плавающей точкой IEE-754, рассмотрите этот онлайн-инструмент , который показывает вам все соответствующие части с плавающей запятой.

8
ответ дан 24 November 2019 в 16:48
поделиться

Ответ на этот вопрос прост, и его можно найти на MSDN

Помните, что число с плавающей запятой может приближаться только к десятичному числу, и что точность числа с плавающей запятой число точек определяет, насколько точно это число приближается к десятичному числу. По умолчанию значение типа Double содержит 15 десятичных цифр точности , хотя внутри поддерживается максимум 17 цифр.

В вашем примере значение i составляет 6,89999999999999946709, которое имеет номер 9 для всех позиций. между 3-ей и 16-й цифрой (не забудьте считать целую часть в цифрах). При преобразовании в строку структура округляет число до 15-й цифры.

i     = 6.89999999999999 946709
digit =           111111 111122
        1 23456789012345 678901
2
ответ дан 24 November 2019 в 16:48
поделиться

Я попытался воспроизвести ваши результаты, но когда я посмотрел «i» в отладчике, он оказался как «6.8999999999999995», а не как «6.89999999999999946709», как вы написали в вопросе. Можете ли вы предоставить шаги, чтобы воспроизвести то, что вы видели?

Чтобы увидеть, что показывает вам отладчик, вы можете использовать DoubleConverter, как в следующей строке кода:

Console.WriteLine(TypeDescriptor.GetConverter(i).ConvertTo(i, typeof(string)));

Надеюсь, это поможет!

Изменить: Я думаю, что я ' m более устал, чем я думал, конечно, это то же самое, что форматирование до значения туда и обратно (как упоминалось ранее).

2
ответ дан 24 November 2019 в 16:48
поделиться

Ответ - да, двойная печать не работает в .NET, они печатают завершающие ненужные цифры.

Вы можете прочитать, как правильно реализовать здесь .

Мне пришлось сделать то же самое для IronScheme.

> (* 10.0 0.69)
6.8999999999999995
> 6.89999999999999946709
6.8999999999999995
> (- 6.9 (* 10.0 0.69))
8.881784197001252e-16
> 6.9
6.9
> (- 6.9 8.881784197001252e-16)
6.8999999999999995

Примечание: и C, и C # имеют правильное значение, просто нарушена печать.

Обновление: я все еще ищу беседу в списке рассылки, которая привела к этому открытию. .

0
ответ дан 24 November 2019 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: