标签: rounding-error

总和除数值问题(处理舍入误差)

我的产品价格为4欧元,我需要将这笔钱分配给3个部门。在第二列上,我需要获取此产品的行数并除以部门数。

我的查询:

select
   department, totalvalue,
   (totalvalue / (select count(*) from departments d2 where d2.department = p.product))
       dividedvalue
from products p, departments d
where d.department = p.department

Department  Total Value  Divided Value
----------  -----------  -------------
A           4            1.3333333
B           4            1.3333333
C           4            1.3333333
Run Code Online (Sandbox Code Playgroud)

但是,当我对这些值求和时,我得到3,999999。当然,在数百行中,我会有很大的不同...有没有机会定义2个十进制数字并舍入最后一个值?(我的结果是1.33 1.33 1.34)我的意思是,有什么方法可以调整最后一行?

sql rounding-error sum divide

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

有没有办法在Javascript中截断科学记数字?

众所周知,因为它是关于SO的最常见的主题之一,我遇到了舍入错误的问题(实际上并不是错误,我很清楚).我不会解释我的观点,而是举例说明我可能拥有的数字以及我希望能够获得的输入:

让我们说吧

var a = 15 * 1e-9;
alert(a)
Run Code Online (Sandbox Code Playgroud)

输出

1.5000000000000002e-8
Run Code Online (Sandbox Code Playgroud)

我希望能够获得1.5e-8,但我不能只乘以10e8,舍入并除以10e8,因为我不知道它是e-8还是e-45或其他任何东西.

所以基本上我希望能够获得该1.5000002部分,应用toFixed(3)并放回指数部分.

我可以转换成字符串和解析,但它似乎不正确...

任何的想法 ?


(如果你觉得这是重复的一个,我提前道歉,但我找不到类似的问题,只有相关问题)

盖尔

javascript floating-point rounding-error scientific-notation rounding

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

无法通过c#代码将十进制数插入sql server表

我无法在Sql Server表中插入十进制值.

我想要做的是通过这些代码行自我解释:

long fileSizeInBytes = ComponentUploadControl.FileContent.Length;
Decimal fileSizeInMB = Convert.ToDecimal(fileSizeInBytes) / (1024.0m * 1024.0m);
Decimal fileSizeInMBRounded = Math.Round(fileSizeInMB, 2);
cmd.Parameters.Add("@fileSize", SqlDbType.Decimal).Value = fileSizeInMBRounded;
Run Code Online (Sandbox Code Playgroud)

插入到数据库中的值将被删除小数位.更具体地说,如果fileSizeInMBRounded是11.73,则插入到数据库中的值是11,00

请帮我

谢谢你的期待

c# rounding-error decimal

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

Chrome 中 SVG 线性渐变的舍入误差?

我最近在 Chrome 渲染 SVG 线性渐变时发现了一些问题。看看下面这个 SVG:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<body>
<svg>
  <g>
    <linearGradient id="linearGradient" gradientUnits="userSpaceOnUse" x1="79px" x2="706px" y1="0" y2="0">
      <stop class="" offset="54.54545454545455%" style="stop-color: red;"></stop>
      <stop class="" offset="63.63636363636364%" style="stop-color: red;"></stop>
      <stop class="" offset="63.63636363636364%" style="stop-color: green;"></stop>
      <stop class="" offset="72.72727272727273%" style="stop-color: green;"></stop>
    </linearGradient>
    <path d="M79,241L136,196L193,194L250,212L307,159L364,152L421,339L478,46L535,205L592,134L649,215L706,74"
    style="opacity: 1; fill: none; stroke: url(#linearGradient); stroke-width: 2px;">
    </path>
  </g>
</svg>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在Chrome中加载此html后(我的版本是23.0.1271.64),很容易在peek中看到线性渐变的明显2px误差,在左侧线段中显示出一些绿色。在 IE 9 和最新的 Firefox 中,svg 都能正确呈现。我认为这可能是 Chrome 或 WebKit 的错误。有谁知道如何解决?谢谢!

svg gradient google-chrome rounding-error linear-gradients

5
推荐指数
0
解决办法
969
查看次数

尝试模仿 Excel 舍入让我感到悲伤

该值是将 2.01 和 2.52 之和除以 2 的结果(2.01 + 2.52) / 2。Excel 将该值显示为 2.265,当格式化为 2 位数字时,该值为 2.27。但是,文件中存储的值为 2.2649999999999997。当我重新创建这是 C# 时,我也在变量中得到该值,而不是 2.265。据我所知,这是由于 4.53 除以 2 的浮点精度问题造成的。

double result = (2.01 + 2.52) / 2;
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

控制台显示 2.265,但 QuickWatch 调试器中显示的值显示 2.264999999999997。我怀疑 WriteLine 方法中将值转换为字符串可以纠正浮点精度错误。

当我申请时Math.Round(result, 2, MidpointRounding.AwayFromZero),结果并不2.262.27我预期的那样。似乎它查看了我想要四舍五入的数字右侧的第一个数字,发现它是 4,并忽略了它右侧的所有其他数字。问题在于,这些 9 只是由于精度问题而存在,并且需要包含在内,或者更好的是,该值应该是2.265

我在代码中所做的就是从 Excel 电子表格中读取文本值"2.2649999999999997",将其转换为双精度型2.264999999999999,然后转换为字符串,这给了我"2.265". 然后我将其转换回双精度,2.265以便我可以将 应用于Math.Round它并获得 的预期结果2.27。这是完整的代码:

double result = Convert.ToDouble(((2.01 + 2.52) …
Run Code Online (Sandbox Code Playgroud)

c# excel rounding-error rounding

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

具有相同初始条件的混沌摆表现出混沌行为

我在 Stack Overflow 上发表的第一篇文章,请耐心等待。我使用 pymunk 物理库在 python 中构建了一个混沌双摆模型,该库又使用了chipmunk C 库。钟摆是混沌的,对初始条件表现出极大的敏感性。然而,我意识到,即使我使用完全相同的初始条件(无论如何更改零代码)运行模拟,这两个模拟也会很快出现分歧。

我的代码中有一些东西每次运行时都有可能产生不同的结果。因为模拟是混乱的,所以运行之间任何不恒定的微小错误都可能导致巨大的变化。

可能是什么原因造成的?我不确定这是否是花栗鼠、pymunk、甚至 python 或我的操作系统/PC 中的小缺陷造成的。

编辑:

这是我的代码:

import pyglet
import pymunk
import pymunk.pyglet_util


def add_pendulum(space):
    static_body = pymunk.Body()
    static_body.position = 400, 400
    mass = 10
    inertia = pymunk.moment_for_box(mass, 5, 100)

    body1 = pymunk.Body(mass, inertia)
    body1.position = 350, 400
    l1 = pymunk.Poly(body1, [(50, 0), (-50, 0), (-50, 5), (50, 5)])
    l1.friction = 0.1
    l1.collision_type = 2
    pivot_joint = pymunk.PivotJoint(static_body, body1, (400, 400))
    space.add(body1, l1, pivot_joint)

    mass = 10
    inertia = pymunk.moment_for_box(mass, …
Run Code Online (Sandbox Code Playgroud)

python rounding-error chipmunk pymunk chaos

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

Python:矩阵乘法的C连续数组和F连续数组之间的舍入误差


问题 :

我偶然发现了一个对行业产生深远(且非常有影响力)影响的问题,并且似乎没有在任何地方记录:

似乎在 python 中,矩阵乘法(使用@np.matmul)在 C 连续数组和 F 连续数组之间给出了不同的答案:

import platform
print(platform.platform()) # Linux-5.10.0-23-cloud-amd64-x86_64-with-glibc2.31
import numpy as np
print(np.__version__) # 1.23.5

np.random.seed(0) # Will work with most of seed, I believe
M, N = 10, 5

X_c = np.random.normal(size=M*N).reshape(M,N)
X_f = np.asfortranarray(X_c)
assert (X_c == X_f).all()

p = np.random.normal(size=N)
assert (X_c @ p == X_f @ p).all() # FAIL
Run Code Online (Sandbox Code Playgroud)

据您所知,此问题是否记录在任何地方?


后果示例:

在某些情况下,这些错误可能会变得很大

示例:在sklearn.linear_model.LinearRegression类中,fit在 F 连续的近奇异矩阵 X(通常来自 pandas DataFrame)的情况下,该方法将导致非常错误的参数。这可能会导致预测到处都是并且 R2 …

python rounding-error contiguous

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

是什么原因导致不同机器之间的舍入误差存在差异?

考虑下面的代码

\n
func main() {\n    var (\n        negativeTwoThirds = -2.0 / 3.0\n        negativeSix       = -6.0\n        negativeThree     = -3.0\n    )\n\n    for _, v := range []float64{negativeTwoThirds} {\n        four := negativeSix * v // 4 = (-6.0) * (-2/3)\n\n        print1(negativeThree + four)\n        print2(negativeThree, four)\n    }\n}\n\nfunc print1(c float64) {\n    fmt.Printf("%f (%b)\\n", c, math.Float64bits(c))\n}\n\nfunc print2(a, b float64) {\n    c := a + b\n    fmt.Printf("%f (%b)\\n", c, math.Float64bits(c))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在个人 Linux 机器以及 go Playground(演示)上尝试了代码,它产生的输出都是我期望的输出

\n
1.000000 (11111111110000000000000000000000000000000000000000000000000000)\n1.000000 (11111111110000000000000000000000000000000000000000000000000000)\n
Run Code Online (Sandbox Code Playgroud)\n

我在两台 macOS 机器上尝试了该代码,两次都出现舍入错误

\n …

operating-system rounding-error go

5
推荐指数
0
解决办法
154
查看次数

将十进制转换为double时的奇怪行为

将十进制转换为double时,我遇到了一个奇怪的问题.

以下代码返回true:

Math.Round(0.010000000312312m, 2) == 0.01m //true
Run Code Online (Sandbox Code Playgroud)

但是,当我将其转换为double时,返回false:

(double)Math.Round(0.010000000312312m, 2) == (double)0.01m //false
Run Code Online (Sandbox Code Playgroud)

当我想使用Math.Pow并且被迫将十进制转换为double时,我遇到了这个问题,因为十进制没有Math.Pow重载.

这是记录在案的行为?当我被迫将十进制转换为双倍时,我该如何避免它?

Visual Studio截图:

Visual Studio截图

施放Math.Round以使结果加倍:

(double)Math.Round(0.010000000312312m, 2)   0.0099999997764825821   double
(double)0.01m   0.01    double
Run Code Online (Sandbox Code Playgroud)

UPDATE

好的,我正在重现这个问题如下:

  1. 当我运行WPF应用程序并在它启动后检查输出时,我就像在空项目上一样真实.
  2. 应用程序的一部分将滑块中的值发送到计算算法.我得到了错误的结果,我在计算方法上加了断点.现在,当我检查监视窗口中的值时,我得到错误(没有任何修改,我只是刷新监视窗口).
  3. 一旦我在一些较小的项目中重现该问题,我将在此处发布.

UPDATE2

不幸的是,我无法在较小的项目中重现这个问题.我认为Eric的答案解释了原因.

.net c# double rounding-error decimal

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

如何计算整数的倒数之和?

我想计算一个整数列表的倒数之和(看看它是否大于或等于1):

在此输入图像描述

我想使用整数来避免浮点舍入问题。为此,我想这样解决:

在此输入图像描述

我已经这样做了:

import numpy as np

my_list = [2, 3, 5, 7]
numerator = 0
for i in range(len(my_list)):
    numerator += np.product(my_list[:i] + my_list[i+1 :])
denominator = np.product(my_list)
result = numerator>=denominator
Run Code Online (Sandbox Code Playgroud)

但我觉得应该为此写一句俏皮话。有没有一个函数可以计算分数倒数之和?或者也许是一个从列表中计算分子的函数?

python integer rounding-error fractions one-liner

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