日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

求qt如何解决小数计算过程中的精度丢失

發布時間:2024/9/27 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求qt如何解决小数计算过程中的精度丢失 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

在下面的例子中,變量a減去一個常量,本該值為0.90,但是通過程序得到a的值0.8999999999,例子如下:

qreal a = 0.95; a = a - 0.05;

不光是做減法的時候會出現這樣的問題,還有做乘法的時候也會出現這樣的問題,例子如下:

qreal a = 1.15; int b = a * 100;

本該a乘以100 后得到的b的值應該為115,然后程序得到的是114。

原因

網上找到的答案是計算機內部需要將小數后的位數轉換為二進制,在這個過程中存在精度的丟失。(大體是這樣,時間原因未深究)

解決方法

初步采用字符串轉換的方式,但似乎并沒有完全解決。

//將m_scale四舍五入取2位QString str = QString::asprintf("%.2f",a);a = str.toDouble();

在采用字符串這樣轉換的情況下,只是解決了上述相減導致的值不正確的現象。求相乘時如何解決精度丟失。
對于上述兩個現象,希望得到正確的數值,望大牛不吝賜教。
后續已經跟進解決,上面對于qreal類型變量與100相乘得到整數,故而無法將最后的正確數值得到,究其原因是因為定義的變量不應該是int型的變量來接收兩者相乘的數值,而應該定義未qreal類型。下面上代碼:
原來的寫法是:

int ratio = m_scale * 100; if(ratio == 114)//只是簡單解決精度丟失254 229 204 {ratio = 115; } else if(ratio == 204) {ratio = 205; } else if(ratio == 229) {ratio = 230; } else if(ratio == 254) {ratio = 255; }

改進之后的寫法:

qreal ratio = m_scale * 100;//將m_scale四舍五入取2位解決精度丟失2021-3-18QString str = QString::asprintf("%.2f",ratio);ratio = str.toDouble();

按照上述的方式可以解決精度丟失問題。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的求qt如何解决小数计算过程中的精度丢失的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。