GVKun编程网logo

MYSQL 在使用双引号和单引号时截断了不正确的 DOUBLE(mysql语句单引号和双引号)

4

本文将带您了解关于MYSQL在使用双引号和单引号时截断了不正确的DOUBLE的新内容,同时我们还将为您解释mysql语句单引号和双引号的相关知识,另外,我们还将为您提供关于assertEquals(D

本文将带您了解关于MYSQL 在使用双引号和单引号时截断了不正确的 DOUBLE的新内容,同时我们还将为您解释mysql语句单引号和双引号的相关知识,另外,我们还将为您提供关于assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异、C++ 中 float、double 或 long double 的精度是什么意思?、C++:将 std::map 转换为 std::map、C++:支持 std::complex AND double 的通用 if 语句的实用信息。

本文目录一览:

MYSQL 在使用双引号和单引号时截断了不正确的 DOUBLE(mysql语句单引号和双引号)

MYSQL 在使用双引号和单引号时截断了不正确的 DOUBLE(mysql语句单引号和双引号)

如何解决MYSQL 在使用双引号和单引号时截断了不正确的 DOUBLE

我创建了一个触发器,用于在另一个表中删除一行后在表中插入一行。

这是我的触发器

  1. CREATE TRIGGER trigger_delete_log_animal AFTER delete ON animal
  2. FOR EACH ROW
  3. INSERT INTO log_animais (momento,ocorrencia)
  4. VALUES (Now(),"The register ''" + old.nome_animal + "'' was deleted from the animal table");

我希望 nome_animal 位于单引号之间。

但是当我从动物表中删除一行时出现以下错误:

  1. Error Code: 1292. Truncated incorrect DOUBLE value: ''The register ''''

我已经尝试将其更改为

  1. ''The register "'' + old.nome_animal + ''" was deleted from the animal table''

还有

  1. "The register \\''" + old.nome_animal + "\\'' was deleted from the animal table"

但这并不好。

我做错了什么?

提前致谢。

解决方法

不要尝试在 SQL 代码中使用 + 构建字符串。

改用CONCAT():

  1. VALUES (now(),CONCAT(
  2. ''The register \\'''',old.nome_animal,''\\'' was deleted from the animal table''));

并且,使用 '' 对您想要的字符串中的 \\ 字符进行转义。

  1. ''Mrs. O\\''Leary\\''s cow.''

assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异

assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异

我进行了一个junit测试,使用以下命令声明了两个Double对象:

Assert.assertEquals(Double expected, Double result);

很好,然后我决定将其更改为使用原始double,除非您也提供了增量,否则该结果被弃用了。

所以我想知道在assertEquals中使用Double对象还是原始类型有什么区别?为什么不使用不带增量的对象,但不推荐使用不带增量的基元呢?Java是否在后台执行了已经考虑了默认增量值的操作?

谢谢。

答案1

小编典典

没有断言方法的JUnit与签名

assertEquals(Double expected, Double result);

但是,有一个通用的对象:

assertEquals(Object expected, Object result);

这将调用对象的equals方法,并且您可以预期,不建议使用此方法来比较Double对象。

如您所见,对于双精度数,绝对有必要使用增量进行比较,以避免浮点舍入的问题(在其他一些答案中已有说明)。如果您使用assertEquals带有double参数的3参数版本

assertEquals(double expected, double actual, double delta);

您的Doubles会被自动取消装箱,double并且一切都会正常运行(并且测试不会意外失败:-)。

C++ 中 float、double 或 long double 的精度是什么意思?

C++ 中 float、double 或 long double 的精度是什么意思?

如何解决C++ 中 float、double 或 long double 的精度是什么意思?

例如,在这个表中,他们说 7 位数字是浮动的,15 位数字是加倍的: https://docs.microsoft.com/en-us/cpp/cpp/data-type-ranges

但是这个语句返回 9:

std::cout << std::numeric_limits<float>::max_digits10 << ''\\n'';

添加此返回 17:

std::cout << std::numeric_limits<double>::max_digits10 << ''\\n'';

也许我们应该从数字中减去 + 或 - 符号以及点? 在这里他们说这种精度保证在文本 -> 数字 -> 文本转换后保留数字: https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10

但是当我这样做时,精度总是 7,在 double 的情况下也是:

#include <iostream>
#include <string>
int main() {
  double d_example = 0.123456789;
  std::string str_example = std::to_string(d_example);
  d_example = stod(str_example);
  std::cout << str_example << ''\\n'';
  std::cout << d_example << ''\\n'';
}

解决方法

这些数字是不同操作的特征。

最大十进制数字 (numeric_limits<>::max_digits10):如果将浮点数转换为具有至少那么多十进制数字的字符串(不包括句点等非数字字符)然后返回一个数,结果数保证与原数相等。

十进制数字 (numeric_limits<>::digits10):如果将至多那么多十进制数字(不包括句点等非数字字符)的字符串转换为浮点数并且然后返回具有相同十进制数字位数的字符串,结果字符串保证与原始字符串表示相同的数字。

单精度浮点数的十进制数字值实际上是 6,而不是 7。有时非正式地给出 7,因为对于大多数 7 位字符串,测试会成功。

,

max_digits10 page you linked 上,有一个示例,将 float 值沿可表示的最小增量进行碰撞,并使用 std::setprecision<< 进行流式传输,并带有输出包括:

   max_digits10 is 9 digits
submax_digits10 is 8 digits
 
[...]
 
   max_digits10: 10.0000095
submax_digits10: 10.00001
 
   max_digits10: 10.0000105
submax_digits10: 10.00001

在那里,您会看到两个 float 值 - 如果使用 max_digits10 精度显示 - 被四舍五入为 10.0000095 和 10.0000105。如果您少使用一位数字来显示它们(这是下一行输出显示的内容,为了简洁起见,只需丢弃尾随的 0),您将获得 相同 10.00001[0] 文本float 值,因此如果您将文本流式传输回 float 变量,则无法重新创建原始 float 值。这就是 max_digits10 的重要性 - 这种可逆的序列化 - 如果你使用了那个数字。

您的代码 - 但是 - 使用 std::to_string,它使用小于 max_digits10 的默认精度。 to_string 旨在生成一种文本表示,该表示对于多种用途而言足够准确,但又不过分冗长。

,

floatdouble 标记为具有 7 位或 15 位数字充其量只是一个粗略的估计,不应用作任何类型的精度数值分析。

要评估精度和数值效果,您应该始终将 floatdouble 类型视为具有 24 位和 53 位精度的二进制数字,因为这就是他们实际上是代表。二进制和数字表示在各种方面是不相称的,因此试图理解或分析行为是十进制的,因此很难理解二进制效果。

您正在查看的数字 std::numeric_limits<Type>::max_digits10,对于典型的 floatdouble 格式是 9 和 17,并不是用来衡量精度的。它们本质上是为了解决这个问题:

  • 我需要将十进制浮点数写入文件,然后将十进制数字从该文件读回浮点数。我需要写多少个十进制数字才能保证读回来会恢复原来的数字?

不是衡量浮点格式的准确性。它包括一些由于二进制和十进制之间的差异而引起的“额外”数字,以允许它们在某种意义上是“偏移”并且不对齐的事实。就好像你有一个奇怪形状的盒子,你正试图把它放进一个长方形的盒子里——你需要一个实际上比奇怪形状的盒子有更大面积的盒子,因为它的配合并不完美。类似地,max_digits10 指定了比浮点类型的实际信息内容更多 的十进制数字。所以它不是正确衡量类型精度的方法。

为您提供有关类型精度信息的参数是 std::numeric_limits<Type>::radixstd::numeric_limits<Type>::digits。第一个是用于浮点的数字基数,在常见的 C++ 实现中为 2。第二个是浮点类型的位数。这些是浮点格式中使用的实际数字;它的有效数是一个由数字基数-基数数字组成的数字。例如,对于常见的floatdouble类型,radix为2,而digits为24或53,所以它们使用24基二数和53基二数分别为数字。

C++:将 std::map<std::string, double> 转换为 std::map<std::string_view, double>

C++:将 std::map 转换为 std::map

如何解决C++:将 std::map<std::string, double> 转换为 std::map<std::string_view, double>

假设我的类 std::map 中有一个私有的 std::map<std::string,double>。我怎样才能转化为 std::map<std::string_view,double> 以返回给用户?我想在这里有以下原型

  1. const std::map<std::string_view,double>&
  2. MyClass::GetInternalMap() const;

解决方法

您不应通过常量引用返回新的 map。您将返回对临时 map 的悬空引用,该引用在 GetInternalMap() 退出时被销毁。如果要返回常量引用,则应按原样返回源 map,例如:

  1. const std::map<std::string,double>& MyClass::GetInternalMap() const
  2. {
  3. return myvalues;
  4. }

否则,改为按值返回新的 map

  1. std::map<std::string_view,double> MyClass::GetInternalMap() const;

话虽如此,std::map<std::string,double> 不能直接转换为 std::map<std::string_view,double>,因此您必须一次手动迭代源 map 一个元素,将每个元素分配给目标 map,例如:

  1. std::map<std::string_view,double> MyClass::GetInternalMap() const
  2. {
  3. std::map<std::string_view,double> result;
  4. for(auto &p : myvalues) {
  5. result[p.first] = p.second;
  6. // or: result.emplace(p.first,p.second);
  7. }
  8. return result;
  9. }

幸运的是,std::pair<std::string,double> 可以隐式转换为 std::pair<std::string_view,double>,因此您可以简单地使用将迭代器范围作为输入的 map 构造函数,并让 map 赋值适合您的元素,例如:

  1. std::map<std::string_view,double> MyClass::GetInternalMap() const
  2. {
  3. return {myvalues.begin(),myvalues.end()};
  4. }

C++:支持 std::complex<double> AND double 的通用 if 语句

C++:支持 std::complex AND double 的通用 if 语句

有没有比下面更聪明的方法 [...] 在某种意义上更聪明 (i) 我不想提取双精度值的 std::real 部分(这可以通过区分类型名来实现在 make_real (ii) 中,我认为可能会重载比较运算符以将它们也用于 double 与 std::complex 比较。

哦,是的。

我不认为这是一个好主意(我不喜欢复杂和浮点之间的 operator<() 的想法)但它是可能的。

您可以按如下方式添加 operator<()

bool operator< (std::complex<double> const & cd,double d)
 { return cd.real() < d; }

或者,如果您希望它更通用,

template <typename D>
bool operator< (std::complex<D> const & cd,D d)
 { return cd.real() < d; }

或者也

template <typename D1,typename D2>
bool operator< (std::complex<D1> const & cd,D2 d)
 { return cd.real() < d; }

以下是您修改的示例。

#include <iostream>
#include <complex>
#include <cmath>

bool operator< (std::complex<double> const & cd,double d)
 { return cd.real() < d; }

using namespace std::complex_literals;

template<typename number=double>
number
compute_number(const number& x,const number& y)
 { return x < 1.0 ? x : y; }

int main()
{
  std::cout << "Evaluate function with double" << std::endl;
  std::cout << compute_number(3.0,4.0) << std::endl;
  std::cout << "Evaluate function with complex number" << std::endl;
  std::cout << compute_number(3.0+2i,4.0-2i) << std::endl;
}

我们今天的关于MYSQL 在使用双引号和单引号时截断了不正确的 DOUBLEmysql语句单引号和双引号的分享已经告一段落,感谢您的关注,如果您想了解更多关于assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异、C++ 中 float、double 或 long double 的精度是什么意思?、C++:将 std::map 转换为 std::map、C++:支持 std::complex AND double 的通用 if 语句的相关信息,请在本站查询。

本文标签: