C++类型转换深度解析:从基础数据类型到字符串,再到基础数据类型的完美转换指南

前言

在 C++ 编程中,我们经常需要在基础数据类型(如 intdoublefloatlongunsigned int 等)与 string 类型之间进行转换。这种转换对于处理用户输入、格式化输出、数据存储等场景至关重要。

本文将详细介绍如何在 C++ 中实现这些转换。

文章目录

    • 前言
    • 基础数据类型转到 string
      • 使用 std::to_string
      • 使用 stringstream
      • 使用 sprintf
      • 使用 iostream
    • string 转化为基础数据类型
      • 使用 stoi,stod,stof,stol
      • 使用 stringstream
      • 使用 atof,atoi,atol
      • stox 与 atox 的使用区别
    • 项目开发中的通用转化形式
      • 直接用标准库中的问题
      • 通用转化形式示例
        • basic_numeric_convertor.h
        • basic_numeric_convertor.cpp
    • 总结

基础数据类型转到 string

使用 std::to_string

C++11 标准库提供了 std::to_string 函数,它适用于基本数值类型,包括 floatdoublelongunsigned int 等。

#include <string>float f = 123.45f;
double d = 123.45;
long l = 123L;
unsigned int ui = 123u;std::string strFloat = std::to_string(f);
std::string strDouble = std::to_string(d);
std::string strLong = std::to_string(l);
std::string strUnsignedInt = std::to_string(ui);

使用 stringstream

stringstream 是处理字符串流的类,可以用来将数值转换为字符串。

#include <sstream>int num = 123;
std::stringstream ss;
ss << num;
std::string str = ss.str();

使用 sprintf

sprintf 函数可以用来将数值格式化为字符串。

#include <cstdio>int num = 123;
char buffer[50];
sprintf(buffer, "%d", num);
std::string str(buffer);

使用 iostream

直接使用 iostream 库中的流操作符重载。

#include <iostream>int num = 123;
std::string str;
std::cout << num;
std::getline(std::cin, str);

string 转化为基础数据类型

使用 stoi,stod,stof,stol

C++11 引入了 stoi(字符串到整数),stod(字符串到双精度浮点数),stof(字符串到单精度浮点数),stol(字符串到长整数)等函数。

#include <string>std::string str = "123";
int num = std::stoi(str);
double dNum = std::stod(str);
float fNum = std::stof(str);
long lNum = std::stol(str);

使用 stringstream

使用 stringstream 将字符串转换为数值。

#include <sstream>std::string str = "123";
int num;
std::stringstream ss;
ss << str;
ss >> num;

使用 atof,atoi,atol

使用 atof(字符串到双精度浮点数),atoi(字符串到整数),atol(字符串到长整数)等函数。

#include <cstdlib>std::string str = "123";
int num = atoi(str.c_str());
double dNum = atof(str.c_str());
long lNum = atol(str.c_str());

stox 与 atox 的使用区别

atoxstox 是C++中用于将字符串转换为基础数据类型的两类函数,但它们属于不同的命名空间,具有不同的特性和使用场景。

我们以 atoistoi 为例来看看它们的差异。

  1. 命名空间:

    • atoi 属于 cstdlib 命名空间,是C标准库的一部分。
    • stoi 属于 std 命名空间,是C++标准库的一部分。
  2. 类型安全:

    • atoi 将字符串转换为 int 类型,但它不进行类型检查。如果字符串表示的数超出 int 类型的范围,将会导致未定义行为。
    • stoi 将字符串转换为模板指定的类型(如 intlongunsigned long 等),如果字符串表示的数超出模板指定类型的范围,stoi 会抛出一个 std::out_of_range 异常。
  3. 异常处理:

    • 使用 atoi 时,如果字符串不是有效的整数,atoi 将返回 0,并且不会提供任何错误的信息或异常。这可能使得调试错误变得更加困难。
    • stoi 在遇到无效输入或数值溢出时会抛出异常,这允许调用者捕获异常并适当地处理错误。
  4. 使用示例:

    • 使用 atoi:
      #include <cstdlib>
      const char* str = "123";
      int num = atoi(str);
      
    • 使用 stoi:
      #include <string>
      std::string str = "123";
      int num = std::stoi(str);
      
  5. C++标准:

    • atoi 是C语言的传统函数,也被C++所兼容。
    • stoi 是C++11标准引入的,是C++语言的一部分,提供了更现代和安全的方法。
  6. 性能:

    • 在某些情况下,atoi 可能比 stoi 稍微快一些,因为它是C语言的函数,没有异常处理的开销。但是,这种差异通常非常小,不足以影响大多数应用程序的选择。
  7. 推荐使用:

    • 在C++项目中,推荐使用 stoi 或其他C++标准库函数,因为它们提供了更好的类型安全和异常处理机制。

项目开发中的通用转化形式

直接用标准库中的问题

当我们在项目中进行开发时,会发现,直接使用这些标准库中的接口,可能会有各种不足的地方。

比如说:期望将字符串转化为非十进制下的数值;对转化失败进行校验;期望能自己控制转化精度;缓存区溢出考虑;期望能跨平台;能通识性的考虑性能等等问题。

这时候按步照搬的使用这些接口可能就适用了,需用开发者自己去封装和适配接口。

在此,笔者提供一种通用的转化形式,供学习者参考下。

通用转化形式示例

basic_numeric_convertor.h
#ifndef _BASIC_NUMERIC_CONVERTOR_H_
#define _BASIC_NUMERIC_CONVERTOR_H_#include <string>using namespace std;class BasicNumericConvertor final
{
public:enum Format{E,  // format as [-]9.9E[+|-]999e,  // format as [-]9.9e[+|-]999f,  // format as [-]9.9G,  // use E or f format, Depends on which way makes the string representation shortestg   // use e or f format, Depends on which way makes the string representation shortest};/*** @brief convert int to string* @param[in]       n       待转换的整数* @param[in]       base    数字将以 {base} 进制进行转换,如:2,8,10,16* @return                  转换后的字符串*/static string numericToString(int n, int base = 10);/*** @brief convert unsigned int to string* @param[in]       n       待转换的整数* @param[in]       base    数字将以 {base} 进制进行转换,如:2,8,10,16* @return                  转换后的字符串*/static string numericToString(unsigned int n, int base = 10);/*** @brief convert long to string* @param[in]       n       待转换的整数* @param[in]       base    数字将以 {base} 进制进行转换,如:2,8,10,16* @return                  转换后的字符串*/static string numericToString(long n, int base = 10);/*** @brief convert unsigned long to string* @param[in]       n       待转换的整数* @param[in]       base    数字将以 {base} 进制进行转换,如:2,8,10,16* @return                  转换后的字符串*/static string numericToString(unsigned long n, int base = 10);/*** @brief convert long long to string* @param[in]       n       待转换的整数* @param[in]       base    数字将以 {base} 进制进行转换,如:2,8,10,16* @return                  转换后的字符串*/static string numericToString(long long n, int base = 10);/*** @brief convert unsigned long long to string* @param[in]       n       待转换的整数* @param[in]       base    数字将以 {base} 进制进行转换,如:2,8,10,16* @return                  转换后的字符串*/static string numericToString(unsigned long long n, int base = 10);/*** @brief convert double to string* @param[in]       n           待转换的浮点数* @param[in]       precision   指定了在转换结果中应包含的小数位数* @param[in]       format      指定浮点数的格式化方式(如'f'、'e'、'g'等)* @return                      转换后的字符串*/static string numericToString(double n, int precision = 6, Format format = Format::f);/*** @brief convert double to string.(注意:如果有效数字全是0,将会使用科学计数法)* @param[in]       n                           待转换的浮点数* @param[in]       isSuppressTrailingZeros     是否抑制末尾的零* @param[in]       precision                   指定了在转换结果中应包含的小数位数* @return                                      转换后的字符串*/static string numericToStringEx(double n, bool isSuppressTrailingZeros, int precision = 6);/*** @brief convert string to short* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 short*/static short stringToShort(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to unsigned short* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 unsigned short*/static unsigned short stringToUShort(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to int* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 int*/static int stringToInt(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to unsigned int* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 unsigned int*/static unsigned int stringToUInt(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to long* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 long*/static long stringToLong(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to unsigned long* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 unsigned long*/static unsigned long stringToULong(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to long long* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 long long*/static long long stringToLongLong(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to unsigned long long* @param[in]       str         待转换的字符串* @param[out]      ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @param[in]       base        数字将以 {base} 进制进行转换,如:2,8,10,16* @return                      转换后的 unsigned long long*/static unsigned long long stringToULongLong(const string& str, bool* ok = nullptr, int base = 10);/*** @brief convert string to float* @param[in]       str         待转换的字符串* @param[in]       ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @return                      转换后的 float*/static float stringToFloat(const string& str, bool* ok = nullptr);/*** @brief convert string to double* @param[in]       str         待转换的字符串* @param[in]       ok          用于接收转换是否成功的结果。如果你传入了 ok 的地址,当转换成功时,*ok 将会被设置为 true;如果转换失败,则设置为 false* @return                      转换后的 double*/static double stringToDouble(const string& str, bool* ok = nullptr);
};#endif  // _BASIC_NUMERIC_CONVERTOR_H_
basic_numeric_convertor.cpp
#include "basic_numeric_convertor.h"#include <QtCore/QMap>
#include <QtCore/QString>#include <cassert>static inline string stringFromQString(const QString& str)
{return string(str.toStdWString().c_str());
}string BasicNumericConvertor::numericToString(int n, int base)
{const QString qs = QString::number(n, base);return stringFromQString(qs);
}string BasicNumericConvertor::numericToString(unsigned int n, int base)
{const QString qs = QString::number(n, base);return stringFromQString(qs);
}string BasicNumericConvertor::numericToString(long n, int base)
{const QString qs = QString::number(n, base);return stringFromQString(qs);
}string BasicNumericConvertor::numericToString(unsigned long n, int base)
{const QString qs = QString::number(n, base);return stringFromQString(qs);
}string BasicNumericConvertor::numericToString(long long n, int base)
{const QString qs = QString::number(n, base);return stringFromQString(qs);
}string BasicNumericConvertor::numericToString(unsigned long long n, int base)
{const QString qs = QString::number(n, base);return stringFromQString(qs);
}string BasicNumericConvertor::numericToString(double n, int precision, Format format)
{const QMap<Format, char> fmtMap = {{Format::E, 'E'},{Format::e, 'e'},{Format::f, 'f'},{Format::g, 'g'},{Format::G, 'G'}};const char qf = fmtMap.value(format);int ep = std::numeric_limmits<double>::digits10;const QString qs1 = QString::number(n, qf, ep);int idx = qs1.indexOf('.');if (idx < 0) {return stringFromQString(qs1);}const QString qs2_ = QString::number(n, qf, precision);idx = qs2_.indexOf('.');if (idx < 0) {return stringFromQString(qs2_);}const QString qs2 = qs2_.leftJustified(idx + 1 + ep, '0');int resIndex = idx + 1;const QString subStr1 = qs1.mid(resIndex, precision + 1);if (qs2.indexOf('.') < 0) {resIndex--;}const QString subStr2 = qs2.mid(resIndex, precision + 1);string res = stringFromQString(qs1).mid(0, resIndex + precision);if (subStr2 != subStr1) {res = stringFromQString(qs2).mid(0, resIndex + precision);}return res;
}string BasicNumericConvertor::numericToStringEx(double n, bool isSuppressTrailingZeros, int precision)
{assert(precision >= 0 && precision <= 24);auto toString = [](double n, int precision) {if ((std::Math::abs(n) - 1.0) > 1e-10) {return BasicNumericConvertor::numericToString(n, precision, BasicNumericConvertor::f);}QString qsF = QString::number(n, 'f', precision);const int dotIndex = std::Math::isNegative(n) ? 2 : 1;assert(precision == 0 || precision + dotIndex + 1 == qsF.length());for (int i = 0; i < precision; ++i) {if (qsF.at(dotIndex + i) != '0') {return BasicNumericConvertor::numericToString(n, precision, BasicNumericConvertor::f);}}QString qsE = QString::number(n, 'e', precision);if (qsE.lastIndexOf("+00") > dotIndex) {return stringFromQString(qsF);}int plusIndex = qsE.lastIndexOf('+');if (plusIndex > dotIndex) {int removeLength = (qsE.at(plusIndex + 1) == '0') ? 2 : 1;qsE = qsE.remove(plusIndex, removeLength);return stringFromQString(qsE);}int minusIndex = qsE.lastIndexOf('-');if (minusIndex > dotIndex) {if (qsE.at(minusIndex + 1) == '0') {qsE = qsE.remove(minusIndex + 1, 1);}return stringFromQString(qsE);}assert(false);return BasicNumericConvertor::numericToString(n, precision, BasicNumericConvertor::f)}string numericString = toString(n, precision);if (isSuppressTrailingZeros && precision > 0) {// todo numericString = }return numericString;
}short BasicNumericConvertor::stringToShort(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toShort(ok, base);
}unsigned short BasicNumericConvertor::stringToUShort(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toUShort(ok, base);
}int BasicNumericConvertor::stringToInt(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toInt(ok, base);
}unsigned BasicNumericConvertor::stringToUInt(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toUInt(ok, base);
}long BasicNumericConvertor::stringToLong(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toLong(ok, base);
}unsigned long BasicNumericConvertor::stringToULong(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toULong(ok, base);
}long long BasicNumericConvertor::stringToLongLong(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toLongLong(ok, base);
}unsigned long long BasicNumericConvertor::stringToULongLong(const string& s, bool* ok, int base)
{const QString qs = QString::fromWCharArray(s);return qs.toULongLong(ok, base);
}template<typename T>
static T toFloatPoint(const QString& qs, bool* ok)
{return 0;
}template<>
float toFloatPoint<float>(const QString& qs, bool* ok)
{return qs.toFloat(ok);
}template<>
float toFloatPoint<double>(const QString& qs, bool* ok)
{return qs.toDouble(ok);
}template<typename T, int ep>
static T toFloatPoint(const string& s, bool* ok)
{const QString qs = QString::fromWCharArray(s);const int index = s.find(L("."));if (index == -1) {return toFloatPoint<T>(qs, ok);}int n = (s.length() - index - 1) > ep ? ep : (s.length() - index - 1);string str1 = s.mid(index + 1, static_cast<int>(n));while(n < ep) {str1 += L("0");n++;}T res = toFloatPoint<T>(qs, ok);int maxEp = std::numeric_limits<double>::max_digits10;const string resStr = stringFromQString(QString::munber(res, 'f', maxEp));const string str2 = resStr.mid(index + 1, static_cast<int>(n));if (str1 > str2) {return res + str::pow(0.1, ep);} else if (str1 < str2) {return res - std::pow(0.1, ep);}return res;
}float BasicNumericConvertor::stringToFloat(const string& s, bool* ok)
{const int ep = std::numeric_limits<float>::digits10;return toFloatPoint<float, ep>(s, ok);
}double BasicNumericConvertor::stringToDouble(const string& s, bool* ok)
{const int ep = std::numeric_limits<double>::digits10;return toFloatPoint<double, ep>(s, ok);
}

总结

本文详细介绍了 C++ 中基础数据类型与 string 之间的转换方法。同时,也讨论了转换过程中可能遇到的问题和注意事项,以及提出的一套通用的转换方法。希望这些信息能够帮助 C++ 开发者更好地处理数据类型转换的任务。

大家要是有不懂的地方,欢迎私信交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刚实习的大学生如何避免招聘骗局?

大学生在求职过程中&#xff0c;常常成为招聘骗局的受害者。为了避免这种情况&#xff0c;大学生需要提高警惕&#xff0c;采取一系列措施来防范招聘骗局。以下是一些建议&#xff1a; 首先&#xff0c;大学生应当保持警惕&#xff0c;不轻信招聘信息。在求职时&#xff0c;务…

使用 Elasticsearch 设计大规模向量搜索

作者&#xff1a;Jim Ferenczi 第 1 部分&#xff1a;高保真密集向量搜索 简介 在设计向量搜索体验时&#xff0c;可用选项的数量之多可能会让人感到不知所措。最初&#xff0c;管理少量向量很简单&#xff0c;但随着应用程序的扩展&#xff0c;这很快就会成为瓶颈。 在本系列…

Linux下的/etc/resolv.conf

Linux下的/etc/resolv.conf 文件用于配置域名解析器的设置&#xff0c;告诉系统在解析域名时要查询哪些DNS服务器。nameserver&#xff1a;指定DNS服务器的IP地址。你可以列出多个nameserver&#xff0c;系统将按顺序尝试它们&#xff0c;直到找到可用的DNS服务器。 nameserve…

ip地址公和内有什么区别

在数字化世界中&#xff0c;IP地址扮演着至关重要的角色。它不仅是网络设备的身份标识&#xff0c;更是信息传输的桥梁。然而&#xff0c;并非所有IP地址都拥有相同的属性和功能。公有IP地址和私有IP地址&#xff0c;作为IP地址的两大类别&#xff0c;它们存在着显著的差异。虎…

C#A类调用B类的方法,在方法中更新B类的控件

1.首先在B类中定义静态成员 public static B bnull; 其次&#xff0c;在B类构造函数中给静态成员初始化 public B(){B this;InitializeComponent();} 在A类中&#xff0c;调用更新B类控件的方法 B.b.Method("已通过"); 2.如果当前方法所在的线程不是UI线程&…

成都百洲文化传媒有限公司电商服务的领航者

在当今数字化浪潮席卷全球的时代&#xff0c;电商行业以其独特的魅力和无穷的潜力&#xff0c;正成为推动经济发展的重要引擎。在这一领域&#xff0c;成都百洲文化传媒有限公司以其专业的电商服务和创新的营销理念&#xff0c;成为了行业的佼佼者&#xff0c;引领着电商服务的…

芯片后端对于芯片设计公司的重要性

在芯片设计流程中&#xff0c;后端设计是一个至关重要的环节&#xff0c;它直接关系到芯片从设计到实际生产的转化&#xff0c;以及最终产品的性能、可靠性、成本和上市时间。 以下是为什么芯片后端非常重要的几个关键原因&#xff1a; 物理实现&#xff1a;后端设计是芯片从逻…

【车载开发系列】车载电源介绍

【车载开发系列】车载电源介绍 【车载开发系列】车载电源介绍 【车载开发系列】车载电源介绍一. 整车的两个电源二. 整车电源的状态1&#xff09;OFF模式2&#xff09;ON模式3&#xff09;ACC模式4&#xff09;CRANK模式 三. 整车电源相关术语说明 一. 整车的两个电源 发电机&…

git子模块应用和常用用法

概念 子模块&#xff1a;分离项目不同模块&#xff0c;集成一个大的项目&#xff0c;方便模块管理&#xff0c;比如模块各自管理自己的依赖。 命令 1. 初始化拉取&#xff0c;更新子模块 git submodule update --init --recursive --remote参数&#xff1a; –init: 初始化远…

CAP理论

CAP理论 在分布式系统的世界中&#xff0c;CAP理论是一个绕不开的话题。CAP&#xff0c;即Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;和Partition tolerance&#xff08;分区容错性&#xff09;&#xff0c;这三个属性在分布式系…

langchain发布了v0.2版本

文章目录 前言1. 文档和可发现性&#xff1a;2. 标准化接口&#xff1a;3. 异步和流媒体支持&#xff1a;4. LangGraph&#xff1a;5. 改进的工具包和回调&#xff1a;6. 向后兼容性和迁移&#xff1a;总结 前言 langchain发布了v0.2版本&#xff0c;LangChain v0.2 相比 v0.1…

Vxe UI vxe-table custom 实现自定义列服务端保存,服务端恢复状态,实现用户个性化列信息保存

Vxe UI vue vxe-table custom 实现自定义列服务端保存&#xff0c;服务端恢复状态&#xff0c;实现用户个性化列信息保存 支持将自定义列状态信息&#xff0c;列宽、冻结列、列排序、列显示隐藏 等状态信息保存到本地或服务端 代码 实现自定义列状态保存功能&#xff0c;只需…

在气膜建筑中运动,我们会感觉到不舒服吗—轻空间

气膜建筑是一种以膜材为主要结构&#xff0c;通过空气压力支撑的新型建筑形式&#xff0c;广泛应用于体育场馆、游泳馆和多功能运动场等领域。然而&#xff0c;人们常常担心在这种建筑中运动是否会感到不适。本文将探讨气膜建筑中运动的舒适度问题&#xff0c;并结合相关的技术…

【深度学习】IP-Adapter 和 InstantID 的核心机制比较

IP-Adapter 和 InstantID 是两个在图像生成中具有不同优势和应用场景的模型。以下是这两个模型的区别及其理论分析。 IP-Adapter 特点: 图像提示能力: IP-Adapter 通过引入图像提示能力&#xff0c;使得预训练的文本到图像扩散模型可以接受图像作为提示&#xff0c;从而生成…

区间预测 | 带有置信区间的BP神经网络时间序列未来趋势预测Matlab实现

下面是一个使用带有置信区间的BP神经网络进行时间序列未来趋势预测的简化示例的Matlab代码。请注意&#xff0c;这只是一个示例&#xff0c;并且可能需要根据您的具体数据和问题进行适当的修改和调整。 matlab % 步骤1&#xff1a;准备数据 % 假设有时间序列数据(time_series…

GaN VCSEL:工艺革新引领精准波长控制新纪元

日本工程师们凭借精湛的技艺&#xff0c;开创了一种革命性的生产工艺&#xff0c;让VCSEL的制造达到了前所未有的高效与精准。这一成果由名城大学与国家先进工业科学技术研究所的精英们联手铸就&#xff0c;将氮化镓基VCSELs的商业化进程推向了新的高峰。它们将有望成为自适应前…

Spring Cloud 之 GateWay

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、通过API网关访问服务2、Spring Cloud GateWay 最主要的功能就是路由…

SQL调优方案

1、尽量避免使用in或not in语句&#xff0c;发生数据库的全表扫描 2、尽量避免使用&#xff01;或< >号&#xff0c;发生数据库的全表扫描 3、在查询多的情况下要使用索引提高查询效率&#xff0c;但也降低了insert或update的操作&#xff0c;对于一个表所要建立的索引…

Web前端转盘抽奖:技术与创意的完美结合

Web前端转盘抽奖&#xff1a;技术与创意的完美结合 在Web前端开发中&#xff0c;转盘抽奖作为一种常见的互动形式&#xff0c;既增加了用户参与度&#xff0c;又提升了用户体验。本文将深入探讨Web前端转盘抽奖的四个方面、五个方面、六个方面和七个方面&#xff0c;带你领略其…

Java中json字符串与json对象

1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串&#xff0c;它遵循json这种格式。 2、前后端交互传输的json是什么&#xff1f; 前后端交互传输的json都是json字符串 比如&#xff1a; 2.1响应过程&#xff1a;后端响应…