我的产品价格为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)我的意思是,有什么方法可以调整最后一行?
众所周知,因为它是关于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
我无法在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
请帮我
谢谢你的期待
我最近在 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 的错误。有谁知道如何解决?谢谢!
该值是将 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.26像2.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) 我在 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 中,矩阵乘法(使用@或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 …
考虑下面的代码
\nfunc 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}\nRun Code Online (Sandbox Code Playgroud)\n我在个人 Linux 机器以及 go Playground(演示)上尝试了代码,它产生的输出都是我期望的输出
\n1.000000 (11111111110000000000000000000000000000000000000000000000000000)\n1.000000 (11111111110000000000000000000000000000000000000000000000000000)\nRun Code Online (Sandbox Code Playgroud)\n我在两台 macOS 机器上尝试了该代码,两次都出现舍入错误
\n …将十进制转换为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截图:

施放Math.Round以使结果加倍:
(double)Math.Round(0.010000000312312m, 2) 0.0099999997764825821 double
(double)0.01m 0.01 double
Run Code Online (Sandbox Code Playgroud)
UPDATE
好的,我正在重现这个问题如下:
UPDATE2
不幸的是,我无法在较小的项目中重现这个问题.我认为Eric的答案解释了原因.
我想计算一个整数列表的倒数之和(看看它是否大于或等于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)
但我觉得应该为此写一句俏皮话。有没有一个函数可以计算分数倒数之和?或者也许是一个从列表中计算分子的函数?