小编use*_*126的帖子

使用具有更多数字的Java Double.toString()样式格式(DecimalFormat不适用于低精度数字)

核心问题是我需要记录一系列双打,每个双打都有不同数量的有效数字.数字的变化有很大的数字.一些有0(例如5257),有些有2(例如1308.75),有些一直有7(例如124.1171875).基本上是小数点后0到7位有效数字之间的所有内容.

标准Double.toString()适用于所有内容,但有7位有效数字.这是一直到6位数字,有效数字都打印没有任何无关紧要的数字.但是对于那些有7位有效数字的人,toString()会将最后一位数字舍入.即

5257 -> "5257"
1308.75 -> "1308.75"
124.1171875 -> "124.117188"
Run Code Online (Sandbox Code Playgroud)

当然我尝试使用DecimalFormat("#.#######"),这解决了丢失有效数字的问题,但它为许多低精度双精度打印了无关紧要的数字.即

1308.75 -> "1308.7499998"
Run Code Online (Sandbox Code Playgroud)

这也是不可接受的,因为它浪费了大量的空间(通常每天记录> 2 GB的数据)和2)它使用日志弄乱了应用程序.

在识别有效数字时,与toString()相比,DecimalFormat似乎很糟糕,无论如何要修复它?我只想使用toString()样式处理有效数字,并将最大位数从6扩展到7.

有任何想法吗?谢谢

java precision double tostring decimalformat

5
推荐指数
1
解决办法
1万
查看次数

Linux/C:检查是否从线程内部发生上下文切换

在 Linux/GNU/C 环境中,正在运行的线程是否可以看到它是否已进入睡眠状态。例如说你有一个像

void foo() {
  startClock();
  bar();   
  endClock();
}
Run Code Online (Sandbox Code Playgroud)

但是您只关心代码本身的运行时间。即您不关心与运行期间挂起的线程相关的任何时间。理想情况下,您可以利用一些系统调用或库,例如 countThreadSwitches(),这样:

void foo() {
  int lastCount = countThreadSwitches();
  startClock();
  bar();
  endClock();
  if (countThreadSwitches() != lastCount)
    discardClock();
Run Code Online (Sandbox Code Playgroud)

}

能够判断线程是否在两个语句之间切换,将允许我们仅测量不受上下文切换影响的运行。

那么,是否有类似假设的 countThreadSwitches() 调用之类的东西?还是该信息对线程本身不透明?

c linux multithreading pthreads

2
推荐指数
2
解决办法
972
查看次数