请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我正在编写一个程序,我需要删除存储在矩阵中的重复点.问题在于,当检查这些点是否在矩阵中时,MATLAB不能在矩阵中识别它们,尽管它们存在.
在以下代码中,intersections函数获取交集点:
[points(:,1), points(:,2)] = intersections(...
obj.modifiedVGVertices(1,:), obj.modifiedVGVertices(2,:), ...
[vertex1(1) vertex2(1)], [vertex1(2) vertex2(2)]);
Run Code Online (Sandbox Code Playgroud)
结果:
>> points
points =
12.0000 15.0000
33.0000 24.0000
33.0000 24.0000
>> vertex1
vertex1 =
12
15
>> vertex2
vertex2 =
33
24
Run Code Online (Sandbox Code Playgroud)
应从结果中消除两点(vertex1和vertex2).它应该通过以下命令完成:
points = points((points(:,1) ~= vertex1(1)) | (points(:,2) ~= vertex1(2)), :);
points = points((points(:,1) ~= vertex2(1)) | (points(:,2) ~= vertex2(2)), :);
Run Code Online (Sandbox Code Playgroud)
在这之后,我们有了这个意想不到的结果:
>> points
points =
33.0000 24.0000
Run Code Online (Sandbox Code Playgroud)
结果应该是一个空矩阵.如你所见,第一对(或第二对)[33.0000 24.0000]已被淘汰,但不是第二对.
然后我检查了这两个表达式:
>> points(1) ~= vertex2(1)
ans …Run Code Online (Sandbox Code Playgroud) 我在mysql表中有这个:

id并且bolag_id是int.lat并且lngitude是double.
如果我使用该lngitude列,则不返回任何结果:
lngitude查询: SELECT * FROM location_forslag WHERE lngitude= 13.8461208
但是,如果我使用该lat列,它会返回结果:
lat查询: SELECT * FROM location_forslag WHERE lat= 58.3902782
该lngitude栏有什么问题?
可能重复:
处理浮点数中的精度问题
我很惊讶为什么我试图在C中使用浮点数(使用GCC 3.2)并且它没有按照我的预期进行.作为示例:
int main() {
float nb = 3.11f;
nb *= 10;
printf("%f\n", nb);
}
Run Code Online (Sandbox Code Playgroud)
显示:31.099998
我对浮动的实现方式及其产生这种意外行为的原因感到好奇吗?
为什么7.30 - 7.20ruby中的代码会返回0.0999999999999996,不是0.10吗?
但是,如果我会写7.30 - 7.16,例如,一切都会好的,我会得到的0.14.
问题是什么,我该如何解决?
我正在规范化数据库,其中一部分涉及将列从一个表转换FLOAT为a DECIMAL(28,18).然后,当我尝试将此已转换的列连接回源列时,在某些情况下它不会返回任何结果.
它似乎与它转变的方式有关.例如, FLOAT转换为a DECIMAL(28,18)产生:
51.051643260000006000
Run Code Online (Sandbox Code Playgroud)
原来FLOAT是
51.05164326
Run Code Online (Sandbox Code Playgroud)
我尝试了各种修改方法FLOAT,但这些方法都没有:
CAST(51.05164326 AS DECIMAL(28,18)) = 51.051643260000000000
STR(51.05164326 , 28,18) = 51.0516432599999990
Run Code Online (Sandbox Code Playgroud)
转换的原因是由于提高了这些字段的准确性.
有没有人有一个一致的策略来转换这些数字,并能够确保后续的连接工作?
提前致谢
厘米
我在php和javascript中看到过这个问题.我有这个号码:float 0.699
如果我这样做:0.699 x 100 = 69.89999999999999
为什么?
编辑
round(0.699 x 10, 2):float 69.90000000000001
我有以下代码:
typedef __int64 BIG_INT;
typedef double CUT_TYPE;
#define CUT_IT(amount, percent) (amount * percent)
void main()
{
CUT_TYPE cut_percent = 1;
BIG_INT bintOriginal = 0x1FFFFFFFFFFFFFF;
BIG_INT bintAfter = CUT_IT(bintOriginal, cut_percent);
}
Run Code Online (Sandbox Code Playgroud)
bintAfter计算后的值是144115188075855872而不是144115188075855871(最后见"2",而不是"1"??).
在较小的值,如0xFFFFFFFFFFFFF,我得到正确的结果.
如何在32位应用程序上运行它?我需要考虑什么?
我的目标是削减一个非常大的数字的一定比例.
我使用VC++ 2008,Vista.
可能重复:
处理浮点数中的精度问题
码:
float flt = 78983636; // stores 78983632. as seen in debugger
flt = 79282056; // stores 79282056.
Run Code Online (Sandbox Code Playgroud)
为什么它不能准确存储第一个值,但能够为更大的第二个值?
考虑下面的代码及其输出:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cmath>
#include <limits>
#include <vector>
int main(int argc, char *argv[])
{
double xleft = 0;
double xright = 1.0;
double dx = 0.1;
std::cout << std::setprecision(36) << "dx is " << dx << std::endl;
int numgridpts = ((int) ceil (( xright - xleft )/dx)) + 1;
for (int i = 0; i < numgridpts ; ++i)
{
std::cout << std::setprecision(36) << xleft + i*dx << std::endl;
}
return 0; …Run Code Online (Sandbox Code Playgroud) 可能重复:
处理浮点数中的精度问题
而99.99*0.01 = 0.99
显然这是一个古老的浮点舍入问题,但是这种情况下的舍入误差对我来说似乎很大; 我的意思是我可能预期结果为0.99990000001或某些类似的'接近'结果.
为了记录,我在JavaVM和.Net环境中得到了相同的答案.
任何理由c都不应该等于0.321?
>>> from math import ceil
>>> a = 123.321
>>> b = a % 60
>>> b
3.320999999999998
>>> ceil(b)
4.0
>>> c = ceil(b) - b
>>> c
0.679000000000002
Run Code Online (Sandbox Code Playgroud)
更新:
对于任何想知道我如何获得我正在寻找的价值的人:
>>> c = b - floor(b)
Run Code Online (Sandbox Code Playgroud)