Какой тип данных лучше всего использовать для денег в C #?

В качестве альтернативы можно полагаться на декартово произведение, предоставляемое itertools: itertools.product, что позволяет избежать создания временного ключа или изменения индекса:

import numpy as np 
import pandas as pd 
import itertools

def cartesian(df1, df2):
    rows = itertools.product(df1.iterrows(), df2.iterrows())

    df = pd.DataFrame(left.append(right) for (_, left), (_, right) in rows)
    return df.reset_index(drop=True)

Быстрая проверка:

In [46]: a = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"])

In [47]: b = pd.DataFrame(np.random.rand(5, 3), columns=["d", "e", "f"])    

In [48]: cartesian(a,b)
Out[48]:
           a         b         c         d         e         f
0   0.436480  0.068491  0.260292  0.991311  0.064167  0.715142
1   0.436480  0.068491  0.260292  0.101777  0.840464  0.760616
2   0.436480  0.068491  0.260292  0.655391  0.289537  0.391893
3   0.436480  0.068491  0.260292  0.383729  0.061811  0.773627
4   0.436480  0.068491  0.260292  0.575711  0.995151  0.804567
5   0.469578  0.052932  0.633394  0.991311  0.064167  0.715142
6   0.469578  0.052932  0.633394  0.101777  0.840464  0.760616
7   0.469578  0.052932  0.633394  0.655391  0.289537  0.391893
8   0.469578  0.052932  0.633394  0.383729  0.061811  0.773627
9   0.469578  0.052932  0.633394  0.575711  0.995151  0.804567
10  0.466813  0.224062  0.218994  0.991311  0.064167  0.715142
11  0.466813  0.224062  0.218994  0.101777  0.840464  0.760616
12  0.466813  0.224062  0.218994  0.655391  0.289537  0.391893
13  0.466813  0.224062  0.218994  0.383729  0.061811  0.773627
14  0.466813  0.224062  0.218994  0.575711  0.995151  0.804567
15  0.831365  0.273890  0.130410  0.991311  0.064167  0.715142
16  0.831365  0.273890  0.130410  0.101777  0.840464  0.760616
17  0.831365  0.273890  0.130410  0.655391  0.289537  0.391893
18  0.831365  0.273890  0.130410  0.383729  0.061811  0.773627
19  0.831365  0.273890  0.130410  0.575711  0.995151  0.804567
20  0.447640  0.848283  0.627224  0.991311  0.064167  0.715142
21  0.447640  0.848283  0.627224  0.101777  0.840464  0.760616
22  0.447640  0.848283  0.627224  0.655391  0.289537  0.391893
23  0.447640  0.848283  0.627224  0.383729  0.061811  0.773627
24  0.447640  0.848283  0.627224  0.575711  0.995151  0.804567
398
задан Cœur 1 February 2019 в 07:02
поделиться

7 ответов

Поскольку это описано в десятичном числе как:

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

Можно использовать десятичное число следующим образом:

decimal myMoney = 300.5m;
397
ответ дан 22 November 2019 в 23:32
поделиться

Система. Десятичное число

Тип Десятичного значения представляет десятичные числа в пределах от положительных 79,228,162,514,264,337,593,543,950,335 к отрицательным 79,228,162,514,264,337,593,543,950,335. Тип Десятичного значения подходит для финансовых вычислений, требующих больших количеств значительных интегральных и дробных цифр и никаких ошибок округления. Десятичный тип не избавляет от необходимости округление. Скорее это минимизирует ошибки из-за округления.

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

113
ответ дан 22 November 2019 в 23:32
поделиться

Используйте Денежный шаблон от Шаблонов Архитектуры приложений для предприятия; укажите сумму, столь же десятичную и валюта как перечисление.

66
ответ дан 22 November 2019 в 23:32
поделиться

Десятичное число. Если Вы выбираете дважды, Вы оставляете себя открытыми для погрешностей округления

21
ответ дан 22 November 2019 в 23:32
поделиться

десятичное число имеет меньший диапазон, но большая точность - таким образом, Вы не теряете все те пенсы со временем!

Полное изложение здесь:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

16
ответ дан 22 November 2019 в 23:32
поделиться

Согласитесь с Денежным шаблоном: Обработка валют является просто слишком громоздкой при использовании десятичных чисел.

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

Кроме того, с классом Валюты нет никакого шанса неумышленного спутывания денег с другими данными.

13
ответ дан 22 November 2019 в 23:32
поделиться

Создайте свой собственный класс. Это кажется нечетным, но тип .NET является несоответствующим для покрытия различных валют.

4
ответ дан 22 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

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