请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我必须计算一些浮点变量,我的同事建议我使用BigDecimal而不是double因为它会更精确.但我想知道它是什么以及如何最大限度地利用它BigDecimal?
这是一个基本问题,但我找不到答案.我已经研究了浮点运算和其他一些主题,但似乎没有任何东西可以解决这个问题.我确定我的术语错了.
基本上,我想要两个数量 - 完成和总数 - 并将它们分成一个百分比(已经完成了多少).数量是longs.这是设置:
long completed = 25000;
long total = 50000;
System.out.println(completed/total); // Prints 0
Run Code Online (Sandbox Code Playgroud)
我已经尝试将结果重新分配给双 - 它打印0.0.我哪里错了?
顺便提一下,下一步是将这个结果乘以100,一旦这个小障碍被推翻,我认为应该很容易.
顺便说一句,这里没有作业,只是普通的老字号(今天可能编码过多).
我们正在用VB.NET和SQL Server重写我们的旧会计系统.我们引入了一个新的.NET/SQL程序员团队来进行重写.大多数系统已经使用Floats完成了Dollar数量.我编程的遗留系统语言没有Float,所以我可能会使用Decimal.
你有什么建议?
Float或Decimal数据类型应该用于美元金额吗?
两者的优点和缺点有哪些?
在我们的日常scrum中提到的一个骗局是,当你计算一个返回超过两个小数位的结果的金额时,你必须要小心.听起来你必须将金额四舍五入到小数点后两位.
另一个Con是所有显示和打印金额必须有一个显示两个小数位的格式声明.我注意到有几次没有这样做,金额看起来不正确.(即10.2或10.2546)
专家是Float只占用磁盘上的8个字节,其中Decimal占用9个字节(十进制12,2)
似乎减法正在触发某种问题,结果值是错误的.
double tempCommission = targetPremium.doubleValue()*rate.doubleValue()/100d;
Run Code Online (Sandbox Code Playgroud)
78.75 = 787.5*10.0/100d
double netToCompany = targetPremium.doubleValue() - tempCommission;
Run Code Online (Sandbox Code Playgroud)
708.75 = 787.5 - 78.75
double dCommission = request.getPremium().doubleValue() - netToCompany;
Run Code Online (Sandbox Code Playgroud)
877.8499999999999 = 1586.6 - 708.75
由此产生的预期值为877.85.
应该怎样做才能确保正确计算?
当存储通常格式为44.087585(即在点之前最多2个数字和6dp)的纬度/经度时,我是否需要打扰bigdecimals?
double r = 11.631;
double theta = 21.4;
Run Code Online (Sandbox Code Playgroud)
在调试器中,这些显示为11.631000000000000和21.399999618530273.
我怎么能避免这个?
在对这个问题的跟进中,似乎有些数字根本不能用浮点表示,而是近似的.
如何存储浮点数?
是否有不同尺寸的通用标准?
如果我使用浮点,我需要注意什么样的问题?
它们是否是跨语言兼容的(即,我需要处理哪些转换才能通过TCP/IP将python程序中的浮点数发送到C程序)?
-亚当
因此,当我使用Doubles在Java中添加或减去时,它会给我带来奇怪的结果.这里有一些:
如果我补充0.0 + 5.1,它给了我5.1.那是对的.
如果我添加5.1 + 0.1,它会给我5.199999999999(重复9s 的数量可能会关闭).那是错的.
如果我减去4.8 - 0.4,它会给我4.39999999999995(再次,重复9s可能会关闭).那是错的.
起初我认为这只是添加带小数值的双打的问题,但我错了.以下工作正常:
5.1 + 0.2 = 5.3
5.1 - 0.3 = 4.8
Run Code Online (Sandbox Code Playgroud)
现在,添加的第一个数字是保存为变量的double,尽管第二个变量从a中获取文本JTextField.例如:
//doubleNum = 5.1 RIGHT HERE
//The textfield has only a "0.1" in it.
doubleNum += Double.parseDouble(textField.getText());
//doubleNum = 5.199999999999999
Run Code Online (Sandbox Code Playgroud) 哪些Java库可以快速实现浮点或定点操作,精度为几千位?他们的表现如何?
对我来说,一个要求是它实现了一种乘法算法,该算法优于天真乘法算法,该算法花费4倍于2倍大数字的数字(比较乘法算法).
java ×6
double ×3
math ×3
bigdecimal ×2
accounting ×1
currency ×1
geospatial ×1
long-integer ×1
precision ×1
println ×1
rounding ×1
sql-server ×1
vb.net ×1