Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MySQL(或C)不匹配双精度或小数_C#_Mysql_String_Double_Decimal - Fatal编程技术网

C# MySQL(或C)不匹配双精度或小数

C# MySQL(或C)不匹配双精度或小数,c#,mysql,string,double,decimal,C#,Mysql,String,Double,Decimal,为什么MySQL或C我不知道是哪一个,不喜欢匹配双精度或十进制变量?它将匹配字符串,但我需要一个双精度或小数点,因为我需要匹配大于或小于小数点。它与十进制或双精度完全不匹配,并且不给出任何错误。这是我的代码: double lat5 = -26.00033; string Lati = "-26.00033"; decimal lat6 = decimal.Parse(Lati, CultureInfo.InvariantCulture); //this CommandString = "SE

为什么MySQL或C我不知道是哪一个,不喜欢匹配双精度或十进制变量?它将匹配字符串,但我需要一个双精度或小数点,因为我需要匹配大于或小于小数点。它与十进制或双精度完全不匹配,并且不给出任何错误。这是我的代码:

double lat5 = -26.00033;
string Lati = "-26.00033";
decimal lat6 = decimal.Parse(Lati, CultureInfo.InvariantCulture);

//this
CommandString = "SELECT * FROM lapdetails2 WHERE Latitude = -26.00033";
//and this work
CommandString = "SELECT * FROM lapdetails2 WHERE Latitude = '" + Lati + "'";
//but this
CommandString = "SELECT * FROM lapdetails2 WHERE Latitude = '" + lat5 + "'";
//and this do not work
CommandString = "SELECT * FROM lapdetails2 WHERE Latitude = '" + lat6 + "'";
MySQL数据库中的数据是双10,5

编辑:这是我尝试的参数化查询:

CommandString = "SELECT * FROM lapdetails2 WHERE Latitude = @Latitude";
MySqlCommand cmd = new MySqlCommand(CommandString);
cmd.Connection = DB.ConnectSQL;
cmd.Parameters.AddWithValue("@Latitude", lat6);
cmd.Connection.Open();
MySqlDataReader reader = cmd.ExecuteReader();
我还根据Rick James的建议将DB数据改为小数8,5,但仍然不起作用

编辑2:我用一个不是很有效的存储过程修复了这个问题,但它可以工作

CREATE DEFINER=```localhost` PROCEDURE `coord_pro`(IN Longi1 double(8,5), IN Longi2 double(8,5), IN lat double(8,5))
BEGIN

create table tmp engine=memory select * 
from lapdetails2 where Latitude = lat AND Longitude >= Longi2 AND Longitude <= Longi1;

END
在哪里 Longi1=实际长度*1.00001; 和 Longi2=实际长度*0.99991


然后从tmp读取值,根据您的精度,应该只有一行

看起来在转换为字符串时必须使用不变量文化:

使用CultureInfo.InvariantCulture可以确保。将用作十进制分隔符。更好的方法是消除撇号,让DMB比较数字,而不是字符串:

首先,不要在FLOAT或DOUBLE上使用M、N,这会导致额外的舍入

如果lat/lng数字上始终有5位小数,请使用小数点8,5。小数将与-26.00033(带引号或不带引号)进行精确比较

一般来说,比较本质上是浮点的相等数字是不明智的,例如纬度/经度

在使用C语言时,请确保四舍五入到小数点后5位,并向MySQL显示一个字符串,而不是浮点数或双精度字符,以确保一致性。也许格式%.5f在C中也能像在C中一样工作

附录

给定一个带有d小数点18,4的表格:

注意dx是如何恰好低于常数的。为了验证,让我们哄骗MySQL提供更精确的值。注:浮点只能容纳大约7位有效数字,存储在24位中

或者


为什么要用记号标记该值?您是否尝试将其用于参数化查询?尝试了参数化查询它不起作用的原因与我的连接字符串“”和+的作用相同。我认为这与MySQL和C在SQL静态数据库中只处理字符串有关。这是可行的,但它正在将其转换为字符串,我需要十进制或双精度。这是我认为我需要的,但我需要在两个给定值之间从DB中选择值,这就是我需要双精度或十进制比较的原因。这可以用字符串来完成吗?不要使用VARCHAR,使用DECIMAL;见我的附录。
// this should be OK
CommandString = "SELECT * FROM lapdetails2 WHERE Latitude = '" + lat5.ToString(CultureInfo.InvariantCulture) + "'";
CommandString = "SELECT * FROM lapdetails2 WHERE Latitude = " + lat5.ToString(CultureInfo.InvariantCulture);
mysql> SELECT d, d<1.2346, d<'1.2346',
                 d=1.2346, d='1.2346',
                 d>1.2346, d>'1.2346'  FROM `dec184` WHERE d = 1.2346;
+--------+----------+------------+----------+------------+----------+------------+
| d      | d<1.2346 | d<'1.2346' | d=1.2346 | d='1.2346' | d>1.2346 | d>'1.2346' |
+--------+----------+------------+----------+------------+----------+------------+
| 1.2346 |        0 |          0 |        1 |          1 |        0 |          0 |
+--------+----------+------------+----------+------------+----------+------------+
mysql> SELECT d, dx, dx<1.2346, dx<'1.2346',
                     dx=1.2346, dx='1.2346',
                     dx>1.2346, dx>'1.2346' FROM `dec184` WHERE d = 1.2346;
+--------+--------+-----------+-------------+-----------+-------------+-----------+-------------+
| d      | dx     | dx<1.2346 | dx<'1.2346' | dx=1.2346 | dx='1.2346' | dx>1.2346 | dx>'1.2346' |
+--------+--------+-----------+-------------+-----------+-------------+-----------+-------------+
| 1.2346 | 1.2346 |         1 |           1 |         0 |           0 |         0 |           0 |
+--------+--------+-----------+-------------+-----------+-------------+-----------+-------------+
mysql> SELECT dx, dx+0 FROM `dec184` WHERE d = 1.2346;
+--------+--------------------+
| dx     | dx+0               |
+--------+--------------------+
| 1.2346 | 1.2345999479293823 |
+--------+--------------------+
mysql> SELECT ROUND(dx,5), ROUND(dx,9) FROM `dec184` WHERE d = 1.2346;
+-------------+-------------+
| ROUND(dx,5) | ROUND(dx,9) |
+-------------+-------------+
|     1.23460 | 1.234599948 |
+-------------+-------------+