我找到了这个很好的舍入解决方案:
static Double round(Double d, int precise) {
BigDecimal bigDecimal = new BigDecimal(d);
bigDecimal = bigDecimal.setScale(precise, RoundingMode.HALF_UP);
return bigDecimal.doubleValue();
}
Run Code Online (Sandbox Code Playgroud)
但是,结果令人困惑:
System.out.println(round(2.655d,2)); // -> 2.65
System.out.println(round(1.655d,2)); // -> 1.66
Run Code Online (Sandbox Code Playgroud)
为什么要提供这个输出?我正在使用jre 1.7.0_45.
任何人都能解释为什么地球上这些"相同"的表达式会返回不同的值吗?
(new BigDecimal(String.valueOf(131.7d))).multiply(new BigDecimal(String.valueOf(0.95d))).doubleValue() = 125.115
(new BigDecimal( 131.7d )).multiply(new BigDecimal( 0.95d )).doubleValue() = 125.11499999999998
Run Code Online (Sandbox Code Playgroud)
BigDecimal在它们之间有什么不同?
我知道double/float的问题,建议使用BigDecimal而不是double/float来表示货币字段.但是双/浮动更有效且节省空间.然后我的问题是:使用double/float来表示Java类中的货币字段是可以接受的,但是使用BigDecimal来处理算术(即在任何算术之前将double/float转换为BigDecimal)和等同检查?
原因是节省了一些空间.我真的看到很多项目正在使用double/float来代表货币领域.
这有什么陷阱吗?提前致谢.
与XSLT和XPath 2.0及更高版本共享的XQuery支持各种数字数据类型,其中两种是xs:double和xs:decimal.如http://www.w3.org/TR/xquery-operators/#casting-to-numerics中所定义,可以转换xs:double为an .xs:decimal
在Java中完成的实现似乎xs:double使用Java double数据类型并xs:decimal使用java.math.BigDecimal类来实现.该类支持两种将a转换double为a的方式BigDecimal,即do BigDecimal.valueOf(doubleValue)和new BigDecimal(doubleValue).据/sf/answers/503040891/,前者给出了更直观的结果,而后者给出了更准确的结果,例如BigDecimal.valueOf(1.1)导致1.1而new BigDecimal(1.1)导致1.100000000000000088817841970012523233890533447265625.
当我尝试的演员xs:double到xs:decimal与撒克逊和存在,那么
xquery version "1.0";
let $d1 as xs:double := 1.1E0
return xs:decimal($d1)
Run Code Online (Sandbox Code Playgroud)
输出1.100000000000000088817841970012523233890533447265625,同时用BaseX它输出1.1.我认为差异来自不同的实现,BaseX做BigDecimal.valueOf(1.1),Saxon和Exist new BigDecimal(1.1).
我的问题是:根据http://www.w3.org/TR/xquery-operators/#casting-to-numerics,哪种方法是实施演员操作的正确方法?
我想创建一个计算乘法整数和大数字的方法.我搜索谷歌和论坛没有找到我.
import java.math.BigDecimal;
private Integer quantite;
private BigDecimal prixUnit;
public Integer getQuantite() {
return quantite;
}
public void setQuantite(Integer quantite) {
this.quantite = quantite;
}
public BigDecimal getPrixUnit() {
return prixUnit;
}
public void setPrixUnit(BigDecimal prixUnit) {
this.prixUnit = prixUnit;
}
public BigDecimal methCal(BigDecimal quantite, BigDecimal prixUnit){
this.prixUnit=prixUnit;
BigDecimal j = new BigDecimal(quantite);
this.j = quantite;
return quantite*prixUnit ;
}
Run Code Online (Sandbox Code Playgroud)
有人能帮我吗?
这个问题是对问题的跟进(BigDecimal - 使用new或valueOf)及其接受的答案.
为方便起见重申问题和答案:
BigDecimal 有两种方法:
double d = 0.1;
BigDecimal bd1 = new BigDecimal(d);
BigDecimal bd2 = BigDecimal.valueOf(d);
Run Code Online (Sandbox Code Playgroud)
哪一个更好?答案显示这些方法不会产生相同的结果:
System.out.println(bd1);
System.out.println(bd2);
Run Code Online (Sandbox Code Playgroud)
显示:
0.1000000000000000055511151231257827021181583404541015625
0.1
Run Code Online (Sandbox Code Playgroud)
在答案中,回答者说:
一般来说,如果结果是相同的(即不是在
BigDecimal大多数情况下,但在大多数情况下),那么valueOf()应该是首选:它可以缓存常见值(如上所示Integer.valueOf()),它甚至可以改变缓存行为呼叫者必须改变.new将始终实例化一个新值,即使没有必要(最好的例子:new Boolean(true)vsBoolean.valueOf(true).).
我的问题是:我们能否得到一些实际的例子,具体来说,我们何时应该使用BigDecimal.valueOf()以及什么时候应该使用new BigDecimal()?回答者说" valueOf()如果结果相同则使用"但这并不能帮助我们知道何时使用它(如果有的话)BigDecimal.
具体来说,哪个更好:
0.1000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)
要么
0.1
Run Code Online (Sandbox Code Playgroud)
?为什么?
我有以下函数用于舍入Java中的double值:
public static double round(double d, int decimalPlace) {
BigDecimal bd = new BigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}
Run Code Online (Sandbox Code Playgroud)
作为输入,此函数正在接收以下值:
double d = 7.3149999999999995;
int decimalPlace = 2
Run Code Online (Sandbox Code Playgroud)
但是,当函数返回时,返回的值是7.31,而不是7.32.我搜索了文档,看看为什么bd.SetScale与这种行为有关,但没有成功.
有没有人能解释为什么会这样?非常感谢!!
我有一个使用 BigDecimal.setScale 将浮点数四舍五入到 n 位数字的函数
private float roundPrice(float price, int numDigits) {
BigDecimal bd = BigDecimal.valueOf(price);
bd = bd.setScale(numDigits, RoundingMode.HALF_UP);
float roundedFloat = bd.floatValue();
return roundedFloat;
}
public void testRoundPrice() {
float numberToRound = 0.2658f;
System.out.println(numberToRound);
float roundedNumber = roundPrice(numberToRound, 5);
System.out.println(roundedNumber);
BigDecimal bd = BigDecimal.valueOf(roundedNumber);
System.out.println(bd);
}
Run Code Online (Sandbox Code Playgroud)
输出:
0.2658
0.2658
0.26579999923706055
Run Code Online (Sandbox Code Playgroud)
如何防止 BigDecimal 在舍入值末尾添加所有这些额外数字?
注意:我无法执行以下操作,因为我无权访问 api 调用函数中的位数。
0.2658
0.2658
0.26579999923706055
Run Code Online (Sandbox Code Playgroud)