我正在从csv导入数据,我需要将一些值转换为BigDecimal,如果无法解析则会引发错误.
从测试开始,BigDecimal("无效数字")返回一个0的BigDecimal.这没关系,但有点凌乱,除了有效值为0 ...
Float("无效数字")的行为不同并抛出异常......
我目前的解决方案是:
class String
def to_bd
begin
Float(self)
rescue
raise "Unable to parse: #{self}"
end
BigDecimal(self)
end
end
Run Code Online (Sandbox Code Playgroud)
我完全错过了什么吗?
hibernate命名查询返回数据类型为NUMBER的列的BigDecimal.
select col1 as "col1" from table1 union select col2 as "col1" from table2
Run Code Online (Sandbox Code Playgroud)
在客户端,我希望col1的数据类型是long(原始)我这样做:
<return-scalar column="col1" type="java.lang.Long" />
Run Code Online (Sandbox Code Playgroud)
要么
<return-scalar column="col1" type="long" />
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我得到:
java.lang.ClassCastException: java.math.BigDecimal incompatible with java.lang.Long
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?我怀疑,别名有什么问题?
在Wicket应用程序中,我有一个十进制数字文本字段:
TextField<BigDecimal> f =
new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share"));
Run Code Online (Sandbox Code Playgroud)
我希望它始终接受两者.(点)和,(逗号)作为小数点分隔符(无论浏览器的语言环境设置如何).
为了显示该值,使用会话的语言环境[在我们的例子中强制为"fi"( - >逗号)],但在这里我对该字段接受的输入感兴趣.
我的问题是,我是否必须将字段更改为TextField<String>,并手动转换为域对象的类型(BigDecimal)?或者是否有某种使用方法TextField<BigDecimal>(允许例如使用Wicket的MinimumValidator或RangeValidator),并且仍然接受两个小数分隔符?
我想在Ruby中正确地将美分转换为美元.我将永远不必使用分数.
是否可以正确执行此操作(没有浮点错误)而不必使用BigDecimal?
例如,美分到美元
"99" => "0.99"
"324" => "3.24"
Run Code Online (Sandbox Code Playgroud)
以下似乎有效,但它是否正确?
(cents.to_i/100.0).to_s
Run Code Online (Sandbox Code Playgroud) 我研究过并发现,在处理货币时,最好的计算方法是BigDecimal上课.
考虑到这一点,我正在制定一个代码,将各种类型的外币兑换成美元,反之亦然(具体而言,是一种取货币并将其兑换成美元货币的现金登记,计算变更并将此金额返还给外币客户).
截至目前,许多方法都使用double,其中两个int作为参数用于计算美元.
题:
由于我想在计算中使用BigDecimal类,我是否应该将所有涉及双精度计算的方法更改为BigDecimal?
我正在尝试在Clojure中使用BigDecimals来模拟(如果需要)任意精度数字.当我尝试从未缩放的值和比例因子实例化BigDecimal时,我有一个奇怪的错误:
user=> 1.31M
1.31M (OK)
user=> (class 1.31M)
java.math.BigDecimal (OK)
user=> (.unscaledValue 1.31M)
131 (OK)
user=> (.scale 1.31M)
2 (OK)
user=> (.movePointLeft (BigDecimal. 131) 2)
1.31M (OK)
user=> (BigDecimal. (BigInteger. "131") 2)
1.31M
user=> (BigDecimal. 131N 2) (WRONG!!!)
IllegalArgumentException No matching ctor found for class java.math.BigDecimal clojure.lang.Reflector.invokeConstructor (Reflector.java:183)
user=> (BigDecimal. (BigInteger. "131") 2)
1.31M
Run Code Online (Sandbox Code Playgroud)
这里的问题是clojure大整数不是java.math.BigInteger对象.偶数(bigint x)不起作用:
user=> (doc bigint)
-------------------------
clojure.core/bigint
([x])
Coerce to BigInt
nil
Run Code Online (Sandbox Code Playgroud)
顺便说一句,BigInteger构造函数不直接接受数值.我知道我也可以这样做:
user=> (BigDecimal. (BigInteger. (.toByteArray (.unscaledValue 1.31M))) (.scale 1.31M))
1.31M
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有更惯用的方法直接管理来自Clojure的BigInteger对象?或者我坚持将所有内容都包装在自定义库中,例如:
user=> (defn my-bigint …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用BigDecimal比较两个四舍五入到两位数的货币值.例如,我希望以下产生0,因为我正在比较应该舍入到0.02的东西和0.02.但它产生-1 !! 有没有正确的方法来做到这一点?
这也适用于较大的数字,如123.45 vs 123.4534 ...当使用"compareTo"时应该产生0.
我尝试过使用数学上下文,但它看起来并不优雅......有正确的方法吗?
BigDecimal spread = new BigDecimal(0.01934);
spread.setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02)));
Run Code Online (Sandbox Code Playgroud)
解决方案是:
BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN);
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread));
Run Code Online (Sandbox Code Playgroud) 我尝试了以下代码.但是使用BigDecimal减去时会得到不同的结果.
double d1 = 0.1;
double d2 = 0.1;
System.out.println("double result: "+ (d2-d1));
float f1 = 0.1F;
float f2 = 0.1F;
System.out.println("float result: "+ (f2-f1));
BigDecimal b1 = new BigDecimal(0.01);
BigDecimal b2 = new BigDecimal(0.01);
b1 = b1.subtract(b2);
System.out.println("BigDecimal result: "+ b1);
Run Code Online (Sandbox Code Playgroud)
结果:
double result: 0.0
float result: 0.0
BigDecimal result: 0E-59
Run Code Online (Sandbox Code Playgroud)
我还在努力.任何人都可以澄清.
我正在尝试使用BigDecimal它,但它总是返回0.我使用时为什么会这样double?
public static void main(String[] args) {
double a = 3376.88;
BigDecimal b = new BigDecimal(a);
System.out.println(a-a/1.05);
System.out.println(b.subtract(b).divide(new BigDecimal(1.05)).doubleValue());
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
有人可以解释为什么第一行的结果为0?
System.out.println((new BigDecimal("1.0E+8")).divide(new BigDecimal(100000000), BigDecimal.ROUND_HALF_UP));
System.out.println((new BigDecimal("1.0E+8")).subtract(BigDecimal.ONE).divide(new BigDecimal(100000000), BigDecimal.ROUND_HALF_UP));
0E+7
1
Run Code Online (Sandbox Code Playgroud) bigdecimal ×10
java ×6
ruby ×2
biginteger ×1
clojure ×1
divide ×1
hibernate ×1
long-integer ×1
rounding ×1
string ×1
wicket ×1