double转QString(不四舍五入)

17 篇文章 1 订阅

转换方法1和2

代码:

// double 转 QString (默认保留4位)
QString doubleToQString(double dValue, int iPos = 4)
{
    QString qstrValue;
    int iValue = dValue * std::pow(10, iPos);
    qstrValue = QString::number(iValue);
    int insertIndex = qstrValue.length() - iPos;
    if(0 == insetIndex)
    {
    	qstrValue.insert(insetIndex, '.');
    	qstrValue.insert(insetIndex, '0');
    }
    else
    {
    	qstrValue.insert(insetIndex, '.');
    }

    return qstrValue;
}

// double 转 string (默认保留4位)
string doubleTostring(double dValue, int iPos = 4)
{
    string strValue;
    int iValue = dValue * std::pow(10, iPos);
    strValue = to_string(iValue);
	
	int insertIndex = strValue.length() - iPos;
    if(0 == insetIndex)
    {
    	strValue.insert(insertIndex, '.');
    	strValue.insert(insertIndex, '0');
    }
    else
    {
    	strValue.insert(insertIndex, '.');
    }

    return strValue;
}

缺陷

以上方法理论上存在int越界问题:
1、如果默认保留的小数点精度要求过大,超过int 范围时会出错(过大时考虑可以使用 longlong 型)
2、考虑到double值在内存中存储方式,有以下情况,比如 168.5747在内存中存储形式可能是 168.574699999…, 这种情况下数据截取会丢精度。

新增一种比较完美的转换函数

代码:

QString StrUtil::doubleToQString(double dValue, int iPos)
{
    double dCalibrationValue = (dValue >= 0 ? 0.00000001 : -0.00000001);
    QString qstrValue;
    qlonglong qllValue = dValue + dCalibrationValue;    // 提取整数部分
    double dSubValue = dValue - qllValue;               // 提取小数部分
    dSubValue += dCalibrationValue;                     // 防止 999 情况

    dSubValue = fabs(dSubValue);
    qlonglong qllSubValue = (qlonglong)(dSubValue * std::pow(10, iPos));
    QString qstr = "";
    if(0 != qllSubValue)
    {
        qstr = QString::number(qllSubValue);
    }

	// 缺位补 0
    while(qstr.length() < iPos)
    {
        qstr.insert(0, '0');
    }

    qstrValue = QString("%1.%2").arg(qllValue).arg(qstr);

    if(qllValue >= 0 && dValue < 0)
    {
        qstrValue.insert(0, '-');
    }

    return qstrValue;
}

缺陷:

  • 当整数部分超过12位以后会导致小数部分数据不准备
  • 当整数部分超过15位以后整数部分和小数部分都会出现问题

这个缺陷可以忽略:因为double本身的表示范围为: 1位符号,11位指数,52位小数
在这里插入图片描述

有更好转换方法,请一起交流分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值