- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的应用程序中进行了大量浮点运算,并且我知道浮点运算不是 100% 准确,这很好,但在打印结果时我还没有找到一种方法正确格式化。
例如
0.1 + 0.1 = 0.19999999999999999999999
Math.sin(Math.PI) = 1.2246E16 而不是 0
诸如 1.000000000000000001 之类的东西
我正在寻找一种通用方法来获取这些结果并获得正确的舍入值(以字符串形式)
这样0.1 + 0.1 = 0.19999999999999999999999 -> 0.2 这个需要向上舍入
Math.sin(Math.PI) = 1.2246E16 -> 0
诸如 1.000000000000000001 -> 1 之类的东西;而这个需要向下舍入
我还想避免在结果为以下情况时丢失数据1.1234567891234567 或 1.33333333333333 在这些情况下,结果应保持不变。
最佳答案
如果您想避免使用格式,可以在打印之前将结果舍入到固定精度,并利用 Java 会进行少量舍入的事实来隐藏表示错误。
例如保留小数点后 6 位
public static double round6(double d) {
return Math.round(d * 1e6) / 1e6;
}
可以准确表示round()
和1e6
的结果。另外“IEEE 754 需要正确的舍入:也就是说,舍入的结果就好像使用无限精确的算术来计算值然后舍入” 剩下的唯一错误是表示错误,因为它采用最接近的可表示值。 Java 的 toString() 假设当您有一个具有最接近的较短十进制可表示值的 double 时,这就是您想要看到的。
例如0.1 的实际值为
System.out.println(new BigDecimal(0.1));
打印
0.1000000000000000055511151231257827021181583404541015625
但是当 Double.toString() 传递这个值时,它确定 0.1 将转换为这个 double,所以这就是它应该显示的内容。
顺便说一句,在 Java 6 中存在一个错误,它不使用最小位数。
for (int i = 1; i <= 9; i++)
System.out.print(i / 1000.0 + " ");
在 Java 6 中打印
0.0010 0.0020 0.0030 0.0040 0.0050 0.0060 0.0070 0.0080 0.0090
在 Java 7 中打印
0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009
<小时/>
如果性能不重要,我经常使用 printf,如果性能不重要,我会使用自定义例程将 double 写入直接 ByteBuffer 到固定精度(有效舍入它),这更快,因为它不会创建任何对象.
I'd also like to avoid losing data in cases like when the result is 1.1234567891234567 or 1.33333333333333 in those cases the result should remain the same.
在这种情况下,在需要显示结果之前不要对结果进行舍入。
关于JAVA浮点运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158517/
为什么 (defun boolimplies (a b) (or (not a) b)) if called as(boolimplies 'a 'b) 返回 B? 即使我不使用任何 boolean
这个问题已经有答案了: Are there builtin functions for elementwise boolean operators over boolean lists? (5 个回答
我正在寻求帮助以使以下功能看起来更清晰。我觉得我可以通过使用更少的代码行来实现同样的目标。 标题看起来一定很困惑,所以让我详细说明一下。我创建了一个函数,它接受用户输入(即 72+5),将字符串拆分为
我正在学习 C++ 并尝试为矩阵编写一个 C++ 类,我在其中将矩阵存储为一维 C 数组。为此,我定义了一个 element成员函数根据矩阵元素在数组中的位置访问矩阵元素。然后我重载了 class
我正在学习 C++ 并尝试为矩阵编写一个 C++ 类,我在其中将矩阵存储为一维 C 数组。为此,我定义了一个 element成员函数根据矩阵元素在数组中的位置访问矩阵元素。然后我重载了 class
伙计们,以下内容不起作用 函数返回 true,变量返回 false,但它不会进入 when 子句。我尝试像这样放大括号 但是当我将变量的值设置为 true 并将上面的代码更改为 它进入w
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我是原生 C 语言的新手,但我没有看到错误。 我尝试在这种情况下使用 if 操作: #define PAGE_A 0 #define PAGE_B 1 int pageID = 0; if (page
我正在从事一个项目,让用户鼠标滚轮移动并知道它向上或向下滚动。在我的代码中,我可以上下移动。但我想将 Action 保存到一个字符串中。例如,如果用户向上向上向下滚动'mhmh' 显示返回“UUD”但
我有一个 MySQL 表 payment我在其中存储客户的所有付款相关数据。表字段为:fileNo , clientName , billNo , billAmount , status 。我想构建一
我的表架构如下: +------+-------+-------+
我有这个(顺便说一句,我刚刚开始学习): #include #include using namespace std; int main() { string mystr; cout << "We
我正在用 bash 构建一个用于 Linux (SLES 11SP3) 的脚本。我想通过使用以下语法查找它的 pid 来检查某个进程是否存在: pid="$(ps -ef | grep -v grep
我有一个包含两列的表格; CREATE TABLE IF NOT EXISTS `QUESTION_CATEGORY_RELATION` ( `question_id` int(16) NOT N
我对 Python 如何计算 bool 语句感到困惑。 例如 False and 2 or 3 返回 3 这是如何评估的?我认为 Python 首先会查看“False and 2”,甚至不查看“or
这个问题在这里已经有了答案: 12 年前关闭。 这可能是非常基本的......但我似乎不明白: 如何 (2 & 1) = 0 (3 & 1) = 1 (4 & 1) = 0 等等.. 上面的这种模式似
无论如何在Haskell中定义如下函数? or True True = True or True undefined = True or True False
如您所知,TCL 有一些数学函数,例如 罪 , 因 , 和 假设 在 中调用的expr 带有 的命令() 大括号如下: puts [expr sin(1.57)] 现在如何使用 TCL 添加功能 li
让我们考虑两个数组列表。 ArrayList list1 = new ArrayList(); list1.add(1); list1.add(2); list1.add(3); ArrayList
我想包含和排除使用AND和OR的专业知识,包括与AND和OR操作正常工作。但是,当将排除专家与AND和OR一起使用时,返回与3相同的结果计数。我使用的是1.4版 Elasticsearch 。帮助我解
我是一名优秀的程序员,十分优秀!