相关疑难解决方法(0)

在Java中使用双倍

我找到了这个很好的舍入解决方案:

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.

java floating-point

57
推荐指数
6
解决办法
3486
查看次数

Android:java舍入错误.无法理解为什么?

任何人都能解释为什么地球上这些"相同"的表达式会返回不同的值吗?

(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在它们之间有什么不同?

java android rounding bigdecimal

7
推荐指数
2
解决办法
1037
查看次数

我们可以使用double来存储货币字段并使用BigDecimal进行算术运算

我知道double/float的问题,建议使用BigDecimal而不是double/float来表示货币字段.但是双/浮动更有效且节省空间.然后我的问题是:使用double/float来表示Java类中的货币字段是可以接受的,但是使用BigDecimal来处理算术(即在任何算术之前将double/float转换为BigDecimal)和等同检查?

原因是节省了一些空间.我真的看到很多项目正在使用double/float来代表货币领域.

这有什么陷阱吗?提前致谢.

java double bigdecimal

5
推荐指数
2
解决办法
1664
查看次数

是应该将xs:double转换为xs:decimal实现为BigDecimal.valueOf(double)还是new BigDecimal(double)?

与XSLT和XPath 2.0及更高版本共享的XQuery支持各种数字数据类型,其中两种是xs:doublexs: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.1new BigDecimal(1.1)导致1.100000000000000088817841970012523233890533447265625.

当我尝试的演员xs:doublexs: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,哪种方法是实施演员操作的正确方法?

java xquery saxon exist-db basex

5
推荐指数
1
解决办法
674
查看次数

如何在java中将整数转换为bigdecimal

我想创建一个计算乘法整数和大数字的方法.我搜索谷歌和论坛没有找到我.

    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)

有人能帮我吗?

java netbeans

3
推荐指数
2
解决办法
2万
查看次数

跟进BigDecimal new或valueof

这个问题是对问题的跟进(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)vs Boolean.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 bigdecimal

2
推荐指数
1
解决办法
1001
查看次数

Java BigDecimal舍入错误

我有以下函数用于舍入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与这种行为有关,但没有成功.

有没有人能解释为什么会这样?非常感谢!!

java android rounding bigdecimal

1
推荐指数
1
解决办法
1009
查看次数

BigDecimal 在与浮点数转换时不保留舍入值

我有一个使用 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)

java rounding bigdecimal

1
推荐指数
1
解决办法
870
查看次数