Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将uint64\U t铸造为双精度时的精度调整_C++_Double_Precision - Fatal编程技术网

C++ 将uint64\U t铸造为双精度时的精度调整

C++ 将uint64\U t铸造为双精度时的精度调整,c++,double,precision,C++,Double,Precision,我有一个方法,它以以下格式返回时间的字符串表示形式:_HH:MM:SS.sss该方法将uint64_t时间(以微秒为单位)作为参数。我可以很容易地将小时和分钟分开,但是当涉及到秒数时,我需要将其转换为双精度,这样我也可以得到秒数的分数 示例代码: std::string getDurationTime(uint64_t time){ std::string returnTime=""; uint64_t tempTime = time; uint64_t hours = (t

我有一个方法,它以以下格式返回时间的字符串表示形式:_HH:MM:SS.sss该方法将uint64_t时间(以微秒为单位)作为参数。我可以很容易地将小时和分钟分开,但是当涉及到秒数时,我需要将其转换为双精度,这样我也可以得到秒数的分数

示例代码:

std::string getDurationTime(uint64_t time){

  std::string returnTime="";

   uint64_t tempTime = time;
   uint64_t hours = (tempTime / 3600000000);
   tempTime -= (hours * 3600000000);

   uint64_t minutes = (tempTime / 60000000);
   tempTime -= (minutes * 60000000);

   double seconds = (double(tempTime) / 1000000);

   stringstream timeOut;

   timeOut<<std::setw(2)<<std::setfill('0')<<hours<<":"<<std::setw(2)<<std::setfill('0')<<minutes<<":"<<std::fixed<<std::setw(6)<<std::setprecision(3)<<std::setfill('0')<<seconds;

  returnTime = "_" + timeOut.str();

  return returnTime;

}
std::string getDurationTime(uint64\u t time){
std::string returnTime=“”;
uint64\u t TENTIME=时间;
uint64_t小时=(TENTIME/3600000000);
试探时间-=(小时*3600000000);
uint64_t分钟=(试探时间/60000000);
试探时间-=(分钟*60000000);
双倍秒=(双倍(试探时间)/1000000);
字符串流超时;

超时您可以使用
seconds=round(秒*1000.0)/1000.0;
将数字四舍五入到每秒数千次。

首先,没有明显的理由限制此函数仅在具有正好64位的无符号整数类型的处理器上运行;使用
uint\u least64\u t
而不是
uint64\u t
。其次,代码需要转换为并不明显D> >双//>。这个转换应该解决什么问题?在C++中执行时间运算时,我建议你看一下C++ 11中的新命名空间。@ Pete Becker,我不明白你的意思是“这个转换应该解决什么问题?”。在3的精度下,A值被改变为0035。(因为.00049999<.0005)我相信你误传了这个问题:
double(103566)/1000000应该是.103566,而不是.1035。@Miek,你是否遵循了我给出的链接?它显示了.104的结果,正如预期的那样。你显示的代码应该工作得很好,所以我怀疑你的实际代码有其他错误,我们看不到。看到中间值0.103499999显然是不正确的。是的。这看起来像是t他找到了解决方案。谢谢。