我知道BigDecimal是用于在Java中表示货币价值的推荐最佳实践.你用什么?您是否更喜欢使用更好的库?
我为生活编写货币交易应用程序,所以我必须处理货币价值(遗憾的是,Java仍然没有十进制浮动类型,并且没有任何东西可以支持任意精确的货币计算)."使用BigDecimal!" - 你可能会说.我做.但现在我有一些代码在性能是一个问题,BigDecimal为超过1000次(!)慢于double原语.
计算很简单:系统做什么是计算a = (1/b) * c很多很多次(其中a,b并c有固定的点值).然而,问题在于此(1/b).我不能使用定点算术,因为没有固定点.而且BigDecimal result = a.multiply(BigDecimal.ONE.divide(b).multiply(c)不仅丑陋,而且缓慢.
我可以用什么来代替BigDecimal?我需要至少10倍的性能提升.我发现了其他优秀的JScience库,它具有任意精度的算术,但它甚至比BigDecimal慢.
有什么建议?
这应该是一个容易的问题,但......
我需要在C#中格式化显示(字符串)的货币
有问题的货币将有自己的规则,例如要使用的符号以及该符号是否应该在价值之前(例如10美元)或之后(例如10₫是越南盾).
但数字的格式取决于用户本地,而不是货币.
例如
1.234,56 ? should be displayed to a user in Vietnam but
1,234.56 ? should be displayed to a user in the US
Run Code Online (Sandbox Code Playgroud)
(格式化为代码,因此很容易看出它们之间的区别,和.)
所以代码就像
Double vietnamTotal = 1234.56;
return vietnamTotal.ToString("c");
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为它将使用用户(或更准确的CultureInfo.CurrentCulture)区域设置格式和货币,所以你会得到$ 1,123.56之类的东西 - 正确使用,和.但错误的符号.
Double vietnamTotal = 1234.56;
CultureInfo ci = new CultureInfo(1066); // Vietnam
return vietnameTotal.ToString("c",ci));
Run Code Online (Sandbox Code Playgroud)
会给1.234,56₫ - 正确的符号,错误的使用,和.对于当前用户.
这篇文章提供了有关正确的事情的更多细节,但没有提供如何做到这一点.
我错过了隐藏在框架中的明显方法?
如果您格式化的货币不是当前文化的本机货币,那么格式化货币的正确方法是什么?
例如,如果我为fr-FR文化格式化美元,我会将其格式化为en-US文化($ 1,000.00)或fr-FR文化,但将欧元符号更改为美元符号(1 000,00) $).或许别的东西($ 1 000,00或1 000,00 USD)?
好的,这是我的问题.基本上我有这个问题.
我有一个像.53999999的号码.如何在不使用任何数学函数的情况下将其四舍五入到54?
我猜我必须乘以100来缩放它,然后除以?那样的东西?
问题在于钱.假设我有50.5399999美元,我知道如何获得50美元,但我没有如何获得美分.我可以获得.539999部分,但我不知道如何将它达到54美分.
我们使用firebird作为我们的数据库.我们如何在数据库中存储货币符号.我们应该使用哪个字符集或通常最佳做法?
例如,存储"$"或"¥"直接显示,但更复杂的符号在数据库表中没有正确显示,即"₡"不会存储在数据库中.
什么被普遍认为是这种事情的"最佳实践".
编辑 -
让我指出我们使用的语言是C#.我怀疑UTF8会是答案,但我们如何将字符存储在数据库中,我们是使用Unicode,Hex还是Decimal等效的....还是我们只是使用字符?
全球公认的国际货币显示方式是什么?
\n\n例如:20 美元、20 美元、20 美元(美国)、\xe2\x82\xac20、20\xe2\x82\xac 等?
\n\n如果有多种显示每种货币的方法,那么显示货币的通用方法是什么?
\ncurrency ×7
java ×3
bigdecimal ×2
formatting ×2
.net ×1
c# ×1
firebird ×1
localization ×1
math ×1
optimization ×1
rounding ×1
unicode ×1