public class doublePrecision {
public static void main(String[] args) {
double total = 0;
total += 5.6;
total += 5.8;
System.out.println(total);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码打印:
11.399999999999
Run Code Online (Sandbox Code Playgroud)
我怎么才能打印(或能够用它)11.4?
在处理现实世界的货币价值时,我建议使用BigDecimal而不是Double.But我没有一个令人信服的解释,除了"通常是这样做".
你能否对这个问题嗤之以鼻?
我们知道使用double货币是容易出错的,不推荐使用.但是,我还没有看到一个现实的例子,BigDecimal虽然double失败了,但不能通过一些舍入来简单地修复.
注意琐碎的问题
double total = 0.0;
for (int i = 0; i < 10; i++) total += 0.1;
for (int i = 0; i < 10; i++) total -= 0.1;
assertTrue(total == 0.0);
Run Code Online (Sandbox Code Playgroud)
不计算,因为它们通过舍入(在这个例子中从0到16的小数位的任何东西)都可以解决.
涉及总结大值计算可能需要一些中间圆棒,但由于流通总货币之中USD 1e12,爪哇double(即标准IEEE双精度其15个十进制数字)仍然是足够美分事件.
涉及分工的计算通常是不精确的,即使是BigDecimal.我可以构造一个不能用doubles 执行的计算,但可以BigDecimal使用100的标度执行,但它不是你在现实中可以遇到的东西.
我没有声称这样一个现实的例子不存在,只是我还没有看到它.
我也肯定同意,使用double更容易出错.
我正在寻找的是如下方法(根据Roland Illig的回答)
/**
* Given an input which has three decimal …Run Code Online (Sandbox Code Playgroud) 我尝试从hibernate注释创建一个表.我需要一个Double类型的列,其长度指定为:(10,2).所以SQL语法显示如下:
... DOUBLE(10,2) ....
Run Code Online (Sandbox Code Playgroud)
我试过这样做:
@Column(length = 10, precision = 2) ...
Run Code Online (Sandbox Code Playgroud)
但是当我查看我创建的表时,没有指定Double列的长度.Hibernate是否有解决方案或是否需要手动更改表配置?
谢谢!
我是二年级计算机科学专业的学生,我刚从第一次面试中回来.
基本上最后我的面试官让我写一个函数,它带有两个参数,一个以磅为单位的数量和一个税率,然后返回一个包含税额的数组.
经过一些试验和错误,我最终写了这样的东西:
public static double[] taxAmount (double pounds, double taxPercentage) {
double taxAmount = pounds * taxPercentage/100;
double[] taxAmountArray = new double[1];
taxAmountArray[0] = taxAmount;
return taxAmountArray;
}
Run Code Online (Sandbox Code Playgroud)
它工作,他似乎很高兴,我想知道为什么我需要为此任务返回一个数组?我觉得问题真的很愚蠢,阵列对这个任务没用了吗?我错过了什么吗?
这段代码没有像我想象的那样工作.
a=-1;
b=0.1;
for(i=0;i<=20;i++){
System.out.println(i + ". x= " + a);
a=a+b;
}
Run Code Online (Sandbox Code Playgroud)
在控制台上我应该看到:
0. x= -1.0
1. x= -0.9
2. x= -0.8
3. x= -0.7
4. x= -0.6
5. x= -0.5
6. x= -0.4
7. x= -0.3
Run Code Online (Sandbox Code Playgroud)
...等等
但这是发生的事情:
0. x= -1.0
1. x= -0.9
2. x= -0.8
3. x= -0.7000000000000001
4. x= -0.6000000000000001
5. x= -0.5000000000000001
6. x= -0.40000000000000013
7. x= -0.30000000000000016
8. x= -0.20000000000000015
9. x= -0.10000000000000014
10. x= -1.3877787807814457E-16
11. x= 0.09999999999999987
12. x= 0.19999999999999987
13. …Run Code Online (Sandbox Code Playgroud) 我正在尝试决定将哪种数据类型用于财务应用程序.
我已阅读Double或BigDecimal应该使用.我在他们之间感到困惑.在这方面的任何帮助将受到高度赞赏
我在包含双字段的类中覆盖了 equals 和 hashCode。我的第一种方法是在 equals 方法中使用 epsilon 测试,在 hashCode 中使用 Double.hashCode( double ),但这会导致相等的对象具有不同的哈希码;这是一个简化的示例:
public class DoubleHashTest2
{
public static void main(String[] args)
{
double base1 = .9;
double base2 = .7;
Test test1 = new Test( base1 - .1 );
Test test2 = new Test( base2 + .1 );
System.out.println( test1.equals( test2 ) );
System.out.println( test1.hashCode() );
System.out.println( test2.hashCode() );
}
private static class Test
{
private double dnum1;
public Test( double dnum1 )
{
this.dnum1 = dnum1;
}
public …Run Code Online (Sandbox Code Playgroud) 该文档Float32并没有真正解释 的行为Float64以及不鼓励它们的原因。
我问这个问题是因为在将这些与控制台 cli 请求或 Rest 请求一起使用时,我看到了奇怪的行为。无论精度如何,发送到 clickhouse 的浮点值在最后一位都会稍微修改。
示例:1258.021545成为1258.0215453.
每次插入这些值时,最后一位数字都会更改。我不认为问题来自太高的精度值,因为这些值来自 Java 双精度数。
我正在测试火花十进制类型的货币量度,并在设置刻度和精度时看到一些奇怪的精度结果,如下所示。我想确保在计算过程中不会丢失任何数据,但是下面的示例不能确保这一点。谁能告诉我为什么Spark sql会发生这种情况?当前版本为2.3.0
val sql = """select cast(cast(3 as decimal(38,14)) / cast(9 as decimal(38,14)) as decimal(38,14)) val"""
spark.sql(sql).show
Run Code Online (Sandbox Code Playgroud)
这返回
+----------------+
| val|
+----------------+
|0.33333300000000|
+----------------+
Run Code Online (Sandbox Code Playgroud) java ×8
double ×3
currency ×2
apache-spark ×1
arrays ×1
bigdecimal ×1
biginteger ×1
clickhouse ×1
hibernate ×1
jpa ×1
precision ×1
scala ×1