Хранение двойного с точностью до 2 цифр - PullRequest
2 голосов
/ 23 февраля 2012

Как мне преобразовать двойное число, чтобы иметь точность 2 места?

Например:

    double x = 1.00d;           
    Console.WriteLine(Math.Round(x,2,MidpointRounding.AwayFromZero));
//Should output 1.00 for me, but it outputs just 1.

Что мне нужно, это хранить 1,00 в двойной переменной, которая принапечатано на консоли печатает 1.00.

Спасибо, -Майк

Ответы [ 4 ]

15 голосов
/ 23 февраля 2012

"x" хранит число - оно не обращает внимания на точность.

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

Console.WriteLine(x.ToString("F2"));
5 голосов
/ 23 февраля 2012

double - это число с плавающей точкой двойной точности IEEE-754. Он всегда имеет точность 53 бита. Он не имеет точности, которая может быть точно представлена ​​в «десятичных разрядах» - как следует из фразы, «десятичные разряды» измеряют только точность относительно системы счисления с основанием 10.

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

Помните также, что double является приближением непрерывного реального значения; то есть значение, при котором нет подразумеваемого дискретного квантования (хотя значения фактически квантованы до 53 битов). Если вы пытаетесь представить дискретное значение , где существует неявное квантование (например, если вы работаете со значениями в валюте, где существует значительная разница между 0,1 и 0,099999999999999), тогда вам следует вероятно, используется тип данных, основанный на целочисленной семантике - либо представление с фиксированной точкой, использующее масштабированное целое число, либо что-то типа .NET decimal.

3 голосов
/ 23 февраля 2012

Это не вопрос хранения , это вопрос форматирования .

Этот код производит 1.00:

double x = 1.00d;
Console.WriteLine("{0:0.00}", Math.Round(x, 2, MidpointRounding.AwayFromZero));
1 голос
/ 23 февраля 2012

Тип данных decimal имеет понятие переменной точности. Тип данных double не имеет. Его точность всегда составляет 53 бита.

Строковое представление по умолчанию для двойного числа слегка округляет его, чтобы минимизировать странные значения, такие как 0.999999999999, а затем отбрасывает любые завершающие нули. Как отмечают другие ответы, вы можете изменить это поведение, используя одну из ToString перегрузок типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...