От длинного до десятичного с десятичной точкой в ​​определенной позиции

В С# у меня есть длинное значение, которое мне нужно преобразовать в десятичное число. Проблема в том, что я хочу поставить десятичную точку в определенной позиции в длинном.

Например, допустим, у меня есть следующий номер как длинный:

long l = 123456789

При преобразовании в десятичное число с плавающей запятой в третьей позиции я хочу иметь следующее:

decimal d = 123456.789

Чтобы дать вам пример, функция в идеале должна быть чем-то вроде BigDecimal.valueOf в Java, который позволяет указать длину и позицию для десятичной точки и возвращает правильное значение.

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


person GammaOmega    schedule 29.07.2014    source источник
comment
Вы пытаетесь преобразовать в десятичную или двойную? Это не одно и то же.   -  person Jon Skeet    schedule 29.07.2014
comment
Извините, ошибся в названии. Я починил это. Я пытаюсь преобразовать из длинного в десятичное.   -  person GammaOmega    schedule 29.07.2014
comment
Сильно связано: Int to Decimal Conversion - вставьте десятичную точку в указанное место   -  person Jeppe Stig Nielsen    schedule 29.07.2014


Ответы (4)


Вы можете использовать конструктор Decimal, который принимает разные составные части. Вам нужно будет немного сдвинуть биты, чтобы получить экспоненту во всех соответствующих разделах, но это не должно быть слишком сложно. Если вы знаете, что ваше значение не будет превышать 62 бита по величине, это также упростит задачу.

person Jon Skeet    schedule 29.07.2014

Почему бы вам не разделить на 1000 (или 10 ^ N, где N — количество знаков после запятой)?

person Peter Gluck    schedule 29.07.2014
comment
Это цель моего вопроса. Мне интересно, есть ли функция С#, похожая на BigDecimal.valueOf, которая позволяет вам конвертировать ее без необходимости выполнять такие вычисления. - person GammaOmega; 29.07.2014
comment
По-видимому, даже если получить разделы немного сложнее, конструктор Decimal может выполнить такую ​​работу: msdn.microsoft.com/en-us/library/bb1c1a6x%28v=vs.110%29.aspx - person GammaOmega; 29.07.2014

Вы можете просто написать цикл, умножающий на 0.1m правильное количество раз, то есть numberOfDecimalPlacesWanted итераций цикла.

person Jeppe Stig Nielsen    schedule 29.07.2014

person    schedule
comment
Вероятно, не точно, если decplaces что-то вроде 25. А может вас действительно спасают странные правила конвертации в decimal? - person Jeppe Stig Nielsen; 29.07.2014
comment
когда int decplace = 25; d= 0.0000000000000000123456789 (LinqPad очень удобен) - person James Curran; 29.07.2014
comment
Он по-прежнему работает для decplaces = 28, но при 29 выдает исключение, говорящее, что оно слишком мало для десятичной дроби. - person James Curran; 29.07.2014
comment
Я учитывал тот факт, что Math.Pow(10, 25) возвращает double, внутреннее значение которого не может быть точно равно 1E+25. Вместо этого будет 1.0000000000000000905969664E+25. Тогда можно было опасаться, что соответствующее десятичное число станет 10000000000000000905969664m. Но на самом деле он становится 10000000000000000000000000m каким-то волшебным образом. Так что я думаю, что ваш метод точен в конце концов. - person Jeppe Stig Nielsen; 29.07.2014