我有一个xsd注释,我试图让Marshal成为一个java对象.我希望java最终得到BigDecimal的价值.我在xsd中输入什么才能使它成功?我正在使用xjc ant任务
<xjc schema="my.xsd" destdir="generated" header="false" extension="true" />
Run Code Online (Sandbox Code Playgroud)
这是相关的xsd -
<complexType name="Size">
<attribute name="height" type="BigDecimal"></attribute> <!-- this is wrong-->
</complexType>
Run Code Online (Sandbox Code Playgroud)
我想为生成的类最终得到这个 -
public class Size {
@XmlAttribute(name = "height")
protected BigDecimal height;
}
Run Code Online (Sandbox Code Playgroud) 我想用逗号和2个小数点格式化BigDecimal数字.例如
Amount is: 5.0001 and formatted to: 5.00
Amount is: 999999999.999999 and formatted to: 999,999,999.99
Amount is: 1000.4999 and formatted to: 1,000.49
Amount is: 9999.089 and formatted to: 9,999.08
Amount is: 0.19999 and formatted to: 0.19
Amount is: 123456.99999999 and formatted to: 123,456.99
Run Code Online (Sandbox Code Playgroud) 我必须将我的Web应用程序与支付网关集成.我想以美元输入总金额,然后将其转换为美分,因为我的支付网关库接受的数量为Cents(类型Integer).我发现Big Decimal在java中操纵货币是最好的方法.目前我接受输入为50美元并将其转换为Integer如下:
BigDecimal rounded = amount.setScale(2, BigDecimal.ROUND_CEILING);
BigDecimal bigDecimalInCents = rounded.multiply(new BigDecimal("100.00"));
Integer amountInCents = bigDecimalInCents.intValue();
Run Code Online (Sandbox Code Playgroud)
这是将美元转换为美分的正确方法还是应该以其他方式实现?
我想减去2个double值,我尝试了以下代码.
double val1 = 2.0;
double val2 = 1.10;
System.out.println(val1 - val2);
Run Code Online (Sandbox Code Playgroud)
我得到了输出,
0.8999999999999999
Run Code Online (Sandbox Code Playgroud)
为了获得输出,0.9我尝试BigDecimal如下,
BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);
System.out.println(val1BD.subtract(val2BD));
Run Code Online (Sandbox Code Playgroud)
我得到了输出,
0.899999999999999911182158029987476766109466552734375
Run Code Online (Sandbox Code Playgroud)
然后我尝试了 BigDecimal.valueOf()
val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);
System.out.println(val1BD.subtract(val2BD));
Run Code Online (Sandbox Code Playgroud)
最后我得到了输出0.9.
我的问题是案例2和案例3有什么区别?
在案例2中为什么我得到这样的输出?
请告诉我这两种方法的区别.提前致谢.
如果不是,我有一个BigDecimal我想要投射的金额,但我做了一个例外:Longnulljava.lang.NullPointerException
BigDecimal bgAmount = getAmount();
long totalSupplyFilterMin =
Optional.ofNullable(bgAmount.longValue()).orElse(Long.MIN_VALUE);
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)