Tag: 精度

Java和SQL Server中的精确噩梦

我一直在努力解决Java和SQL Server中的精确噩梦,直到​​我不知道为止。 就个人而言,我理解这个问题及其根本原因,但向全球客户解释这一点是不可行的(至少对我而言)。 情况就是这样。 我在SQL Server中有两列–Qty INT和Price FLOAT。 这些值为 – 1250和10.8601 – 因此,为了获得总值,其数量*价格和结果为13575.124999999998(在Java和SQL Server中)。 那是对的。 问题是这个 – 客户端不想看到它,他们只看到这个数字为13575.125就是这样。 在一个地方,他们可以用2位小数精度看到它,另外4位小数。 当以4位小数显示时,数字是正确的 – 13575.125,但是当以2位小数显示时,他们认为它是错误的 – 13575.12 – 应该是13575.13! 帮帮我。

如何生成一个n个随机正整数序列,它们加起来有些值?

我正在尝试生成一个整数数组,其中包含与特定值相加的randoms。 这是我的代码: private long[] getRandoms(long size , long sum) throws Exception { double iniSum = 0; System.out.println(“sum = ” + sum); long[] ret = new long[(int) size]; for (int i = 0 ; i < ret.length; i++) { ret[i] = randomInRange(1, sum); iniSum += ret[i]; } double finSum = 0; for (int i = 0 […]

为什么这个轴承计算如此疏散?

它甚至不准确吗? 我用Apfloat任意精度重新实现了整个事情,它没有任何区别,我应该知道开始!! public static double bearing(LatLng latLng1, LatLng latLng2) { double deltaLong = toRadians(latLng2.longitude – latLng1.longitude); double lat1 = toRadians(latLng1.latitude); double lat2 = toRadians(latLng2.latitude); double y = sin(deltaLong) * cos(lat2); double x = cos(lat1) * sin(lat2) – sin(lat1) * cos(lat2) * cos(deltaLong); double result = toDegrees(atan2(y, x)); return (result + 360.0) % 360.0; } @Test […]

为什么Java增量运算符允许在没有显式转换的情况下缩小操作?

可能重复: Java + =运算符 在Java中,这是无效的(不编译),如预期的那样: long lng = 0xffffffffffffL; int i; i = 5 + lng; //”error: possible loss of magnitude” 但这很好(?!) long lng = 0xffffffffffffL; int i = 5; i += lng; //compiles just fine 这显然是一个缩小的操作,可能超过int范围。 那么编译器为什么不抱怨呢?

具有给定精度的快速双字符串转换

我需要将double转换为具有给定精度的字符串。 String.format(“%.3f”, value) (或DecimalFormat)完成了这项工作,但基准测试表明,与不是非常快的Double.toString转换相比,它速度很慢(在我的机器上转换100万个数字大约需要1-3秒) )。 有没有更好的方法呢? 更新:基准测试结果 从0到1000000的随机数,结果是每毫秒的运算(Java 1.7.0_45) Benchmark Mean Mean error Units String_format 747.394 13.197 ops/ms BigDecimal_toPlainString 1349.552 31.144 ops/ms DecimalFormat_format 1890.917 28.886 ops/ms Double_toString 3341.941 85.453 ops/ms DoubleFormatUtil_formatDouble 7760.968 87.630 ops/ms SO_User_format 14269.388 168.206 ops/ms 更新: Java 10,+ ryu Mode Cnt Score Error Units String_format thrpt 20 998.741 ± 52.704 ops/ms BigDecimal_toPlainString […]

Java Mutable BigInteger类

我正在使用BigIntegers进行计算,它使用一个调用multiply()大约1000亿次的循环,而BigInteger创建的新对象使得它非常慢。 我希望有人写过或找到了MutableBigInteger类。 我在java.math包中找到了MutableBigInteger,但它是私有的,当我将代码复制到一个新类时,会出现很多错误,其中大部分都是我不知道如何修复的。 像MutableBigInteger这样的Java类有哪些实现允许修改值?

如何在需要使用float时实际避免浮点错误?

我试图使用一些UI按钮来影响3D模型的转换,以将位置移动0.1或-0.1。 我的模型位置是一个三维浮点数,因此只需将0.1f添加到其中一个值就会导致明显的舍入误差。 虽然我可以使用像BigDecimal这样的东西来保持精度,但我仍然必须将它从浮点数转换回到最后的浮点数,它总是会导致愚蠢的数字使我的UI看起来像一团糟。 我可以很好地显示显示的值,但是舍入错误只会随着更多编辑而变得更糟,并且它们使我的保存文件难以阅读。 那么当我需要使用浮点数时,如何才能真正避免这些错误呢?

tan 45给了我0.9999

为什么tan 45 (弧度为0.7853981633974483)给我0.9999 ? 以下代码有什么问题? System.out.println(Math.tan(Math.toRadians(45.0)) ); 我不认为这里有任何错字。 那么这里的解决方案是什么?

如何使用可变精度的Java String.format?

我想根据用户输入改变字符串中双重表示的精度。 现在我正在尝试这样的事情: String foo = String.format(“%.*f\n”, precision, my_double); 但是我收到了java.util.UnknownFormatConversionException 。 我对这种方法的启发是C printf和这个资源 (1.3.1节)。 我在某处有一个简单的语法错误,Java支持这种情况,还是有更好的方法? 编辑: 我想我可以这样做: String foo = String.format(“%.” + precision + “f\n”, my_double); 但是我仍然对这种操作的原生支持感兴趣。

如何精确地将毫秒转换为秒

我希望尽可能精确地将毫秒转换为秒(例如1500ms至1.5s,或500ms至0.5s)。 Double.parseDouble(500 / 1000 + “.” + 500 % 1000); 这不是最好的方法:我正在寻找一种方法来从除法运算中得到余数,所以我可以简单地添加余数。