QT开发积累——qt中的double和float精度问题

在这里插入图片描述

引出

QT开发积累——qt中的double和float精度问题


qt中的double和float精度问题

在C++中,floatdouble是两种常用的浮点数类型,但它们的表示范围和精度有所不同。以下是它们的一些关键区别:

float

  • 大小:通常占用4个字节(32位)。
  • 精度:大约7位十进制数字。
  • 范围:大约 1.2E-383.4E+38
  • 用途:适用于空间和精度要求不高的场景,例如图形处理。

double

  • 大小:通常占用8个字节(64位)。
  • 精度:大约15-16位十进制数字。
  • 范围:大约 2.3E-3081.7E+308
  • 用途:适用于需要更高精度和更大范围的场景,例如科学计算。

解释

  1. 浮点数值
    • 输出表明float类型只能精确到约7位小数,而double类型可以精确到约15-16位小数。
  2. 精度和范围
    • 使用std::numeric_limits类,可以获取浮点数类型的精度和范围信息。
    • digits10成员表示该类型可以精确表示的十进制位数。
    • minmax成员表示该类型可以表示的最小值和最大值。
  3. 潜在的精度差异
    • 在实际应用中,特别是涉及大量浮点运算或需要高精度的计算时,double 类型通常比 float 类型更可靠。

通过这些信息,你可以更好地理解floatdouble的区别,并根据具体需求选择合适的浮点数类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在Qt中,使用qDebug()来输出浮点数时,你可以设置输出格式,以确保小数点后有固定的位数。为了实现这一点,你可以使用QTextStream来格式化输出。以下是一个示例,展示如何在qDebug()中输出小数点后固定10位的小数:

使用 QTextStream 格式化输出

  • 创建两个 QString 对象 floatOutputdoubleOutput,用于存储格式化后的字符串。
  • 创建两个 QTextStream 对象 floatStreamdoubleStream,分别与 floatOutputdoubleOutput 关联。

设置 QTextStream 的格式

  • 使用 setRealNumberNotation(QTextStream::FixedNotation) 设置为定点表示法。
  • 使用 setRealNumberPrecision(10) 设置输出精度为10位小数。

将浮点数写入 QTextStream

  • floatValdoubleVal 写入各自的 QTextStream

使用 qDebug() 输出格式化后的字符串

  • floatOutputdoubleOutput 输出。
// Two float values
        float num1 = 1.2345678f;
        float num2 = 9.8765432f;

        // Multiplication results
        float resultFloat = num1 * num2;
        double resultDouble = num1 * num2;

        // Using QTextStream to format the output
        QString floatOutput, doubleOutput;
        QTextStream floatStream(&floatOutput);
        QTextStream doubleStream(&doubleOutput);

        floatStream.setRealNumberNotation(QTextStream::FixedNotation);
        floatStream.setRealNumberPrecision(10);
        doubleStream.setRealNumberNotation(QTextStream::FixedNotation);
        doubleStream.setRealNumberPrecision(10);


//        floatStream << num1;
//        doubleStream << num2;

//        qDebug() << "num1: " << floatOutput;
//        qDebug() << "num2: " << doubleOutput;

        floatStream << resultFloat;
        doubleStream << resultDouble;

        qDebug() << "float: " << floatOutput;
        qDebug() << "double: " << doubleOutput;

qt中的三元表达式

在 Qt(以及整个 C++)中,三元表达式(也叫条件运算符)是一个简洁的条件判断方式。其语法如下:

cpp
condition ? expression1 : expression2;

其中,condition 是一个布尔表达式,如果 conditiontrue,则整个表达式的值为 expression1,否则为 expression2

这是一个简单的例子,展示了如何在 Qt 中使用三元表达式:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
   
    QCoreApplication a(argc, argv);

    int x = 5;
    int y = 10;

    // 使用三元表达式
    int max = (x > y) ? x : y;

    qDebug() << "The maximum value is:" << max;

    return a.exec();
}

在这个示例中:

  1. 我们有两个整数 xy
  2. 使用三元表达式 (x > y) ? x : y 计算 xy 中的较大值,并将结果赋值给 max
  3. 使用 qDebug() 打印出 max 的值。

三元表达式在许多场合下可以使代码更加简洁和易读,特别是用于简单的条件判断时。它们在 Qt 和标准 C++ 中都是相同的。

更复杂的例子

如果你想在 Qt 中用三元表达式处理更复杂的逻辑,例如决定要显示的字符串,你可以这样:

#include <QCoreApplication>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[]) {
   
    QCoreApplication a(argc, argv);

    bool isMorning = true;
    QString greeting = isMorning ? QString("Good morning") : QString("Good evening");

    qDebug() << greeting;

    return a.exec();
}

在这个示例中:

  1. 我们有一个布尔变量 isMorning,表示当前是否是早上。
  2. 使用三元表达式决定 greeting 应该是 "Good morning" 还是 "Good evening"
  3. 使用 qDebug() 打印出 greeting 的值。

这个示例展示了如何在 Qt 中使用三元表达式来处理 QString 对象,从而根据条件生成不同的字符串。

char 和 qchar的区别

charQChar 是两种不同的数据类型,分别用于不同的上下文和库。以下是它们的主要区别:

char

  • 类型定义char 是 C++ 标准库中的基本数据类型之一,用于表示单个字符。
  • 大小:通常占用 1 字节(8 位)的内存。
  • 编码:通常使用 ASCII 编码,但也可以用于其他编码方式(如 UTF-8)。
  • 范围:可以表示从 -128 到 127 或从 0 到 255 的整数值,具体取决于是否使用有符号或无符号类型。
  • 使用场景:主要用于 C++ 标准字符串(如 std::string)和 C 风格字符串(如 char[]char*)。

QChar

  • 类型定义QChar 是 Qt 库中定义的数据类型,用于表示 Unicode 字符。
  • 大小:通常占用 2 字节(16 位)的内存。
  • 编码:支持 Unicode 编码,可以表示几乎所有的 Unicode 字符。
  • 范围:可以表示从 U+0000 到 U+FFFF 的 Unicode 字符。
  • 使用场景:主要用于 Qt 的字符串类(如 QString),这些类支持 Unicode 字符串操作。

主要区别总结

  • 编码支持char 主要用于 ASCII 或 UTF-8 编码,而 QChar 用于 Unicode 编码。
  • 内存占用char 通常占用 1 字节,而 QChar 占用 2 字节。
  • 功能和方法QChar 提供了许多方便的方法来处理 Unicode 字符,而 char 则更基础,依赖于标准库或自定义方法。

转换方法

  • QCharchar:可以使用 QChar::toLatin1()QChar::toAscii() 方法将 QChar 转换为 char
  • charQChar:可以直接将 char 赋值给 QChar,因为 QChar 提供了相应的构造函数。

例如:

QChar qchar('A'); // 直接从 char 构造 QChar
char ch = qchar.toLatin1(); // 将 QChar 转换为 char

在处理国际化和多语言文本时,QCharQString 提供了更强大的功能和更好的支持,特别是在需要处理非 ASCII 字符和 Unicode 字符时。


总结

QT开发积累——qt中的double和float精度问题


日积月累,开发集锦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arya's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值