我是Java的新手并尝试使用BigDecimal(例如99999999.99)并将其转换为字符串但没有小数位和尾随数字.另外,我不想要数字中的逗号,也不需要舍入.
我试过了:
Math.Truncate(number)
Run Code Online (Sandbox Code Playgroud)
但不支持BigDecimal.
有任何想法吗?
非常感谢.
我想弄清楚如何将货币金额向上舍入到最接近的5美分.以下显示了我的预期结果
1.03 => 1.05
1.051 => 1.10
1.05 => 1.05
1.900001 => 1.10
Run Code Online (Sandbox Code Playgroud)
我需要结果的精度为2(如上所示).
按照下面的建议,我能做的最好的就是这个
BigDecimal amount = new BigDecimal(990.49)
// To round to the nearest .05, multiply by 20, round to the nearest integer, then divide by 20
def result = new BigDecimal(Math.ceil(amount.doubleValue() * 20) / 20)
result.setScale(2, RoundingMode.HALF_UP)
Run Code Online (Sandbox Code Playgroud)
我不相信这是100%犹太人 - 我担心转换到双打时精度可能会丢失.然而,这是迄今为止我提出的最好的,似乎有效.
我正在寻找一个可以进行十进制浮点运算的C++类.通过http://speleotrove.com/decimal/查看,可以找到人们编写和未维护的各种类的链接.挖掘decNumber ++的东西让我看到一些电子邮件,表明GCC最终会支持这个功能.(正式名称为ISO/IEC TR 24733)
我正在寻找一些我可以用作浮动或双重替代品的东西,这是其他人在他们自己的项目中使用的东西.希望开源.
谢谢!
编辑:我应该指出,我正在尝试使用它来代表价格.所以我需要精确的小数,而不是巨大的小数.
运行这个简单的程序:
public static void main(final String... args)
{
System.out.println(BigDecimal.ZERO.scale());
System.out.println(new BigDecimal("0").scale());
System.out.println(new BigDecimal("0.0").stripTrailingZeros().scale());
System.out.println(new BigDecimal("1.0").stripTrailingZeros().scale());
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
0
1
0
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:为什么不是第三个println输出0?那似乎合乎逻辑......
编辑:好的,所以,这是一个非常古老的错误:
事实上,它"适用于"任意数量的零:new BigDecimal("0.0000").stripTrailingZeroes().scale()是4!
我有一个BigDecimal,其值为450.90,我想要向上舍入到下一个空洞整数值,然后打印没有任何小数点的整数值,就像这样;
Val:450.90 - > Rounded:451.00 - >输出:451
Val:100.00001 - > Rounded:101.00000产量:101
检查了一些解决方案,但我没有得到预期的结果,继承我的代码;
BigDecimal value = new BigDecimal(450.90);
value.setScale(0, RoundingMode.HALF_UP); //Also tried with RoundingMode.UP
return value.intValue();
Run Code Online (Sandbox Code Playgroud)
谢谢!
Java 8为我们提供了Math.addExact(),但不是小数.
是否有可能double和BigDecimal溢出?通过Double.MAX_VALUE和如何获得最大的BigDecimal值判断我会说答案是肯定的.
因此,为什么我们不也Math.addExact()为这些类型?什么是最可维护的方式来检查这个?
我很难搞清楚如何转换它.这就是我想要的:
int i = 5900;
BigDecimal bD = new BigDecimal(i);
Run Code Online (Sandbox Code Playgroud)
我需要bD为59.00,但我无法弄清楚如何得到这个结果.所有我能得到的是5900作为BigDecimal类型.任何建议都会有所帮助,谢谢.
Java是如何BigDecimal痛苦的?
Double d = 13.3D;
BigDecimal bd1 = new BigDecimal(d);
BigDecimal bd2 = new BigDecimal(String.valueOf(d));
System.out.println("RESULT 1: "+bd1.toString());
System.out.println("RESULT 2: "+bd2.toString());
RESULT 1: 13.300000000000000710542735760100185871124267578125
RESULT 2: 13.3
Run Code Online (Sandbox Code Playgroud)
是否存在需要结果1的情况?我知道Java 1.5改变了toString()方法,但这是预期的后果吗?
我也意识到BigDecimal有doubleValue()等等,但我正在使用的库有用地使用了一个toString(),我无法改变:-(
干杯.
我正在制作一个应用程序,它需要一堆日记帐分录并计算总和.
当有多个线程调用该addToSum()方法时,下面的方法是线程/并发安全.我想确保每次通话都能正确更新总数.
如果不安全,请说明我必须做些什么来确保螺纹安全.
我需要synchronize获取/放置还是有更好的方法?
private ConcurrentHashMap<String, BigDecimal> sumByAccount;
public void addToSum(String account, BigDecimal amount){
BigDecimal newSum = sumByAccount.get(account).add(amount);
sumByAccount.put(account, newSum);
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
更新:
谢谢大家的答案,我已经知道上面的代码不是线程安全的.
感谢Vint建议AtomicReference作为替代品synchronize.之前我AtomicInteger用来保存整数和,我想知道BigDecimal是否有类似的东西.
关于两者的赞成和反对,这是一个明确的结论吗?
java concurrency thread-safety bigdecimal concurrent-collections
在我的应用程序中,所有BigDecimal数字都缩放为两位小数.换句话说,每次我在代码中创建一个新的BigDecimal时,我也需要使用方法比例:
BigDecimal x = BigDecimal.ZERO;
x.setScale(2, RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)
因此,为了最大限度地减少工作量,我想创建自定义BigDecimal类型,例如:
public class CustomBigDecimal extends BigDecimal {
public CustomBigDecimal(String val) {
super(val);
this.setScale(2, RoundingMode.HALF_UP);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道this.setScale(2, RoundingMode.HALF_UP);不做这项工作,但我找不到办法,是否有可能?
bigdecimal ×10
java ×9
rounding ×2
c++ ×1
concurrency ×1
decimal ×1
double ×1
math ×1
precision ×1