我正在考虑用g ++的std :: decimal :: decimal32/64/128类型替换我们代码中的双打,以达到货币数量和价格的目的,但是我已经陷入了如何最好地输入和输出数据.具体来说,似乎没有任何用于转换为字符串/从字符串转换的例程,并且字符串流机制不会针对这些类型进行编译.我认为这样做的唯一方法是使用double作为中间类型,但是如果我们总是通过双精度输入和输出,这肯定至少部分地违背了使用小数类型的目的?
我确定我不会在这里理解一些东西,所以欢迎一些关于如何最好地使用这些类型的反馈.
编辑:
我已经将几个输入/输出程序一起攻击了,但是我对它们都不满意.输入几乎不稳健(没有科学记数支持),输出程序简单,更不用说由于双重转换而导致效率低下.
#define MAX_DEC_LEN 17
std::decimal::decimal64 FromString(const char* str)
{
if (strlen(str) > MAX_DEC_LEN)
throw std::runtime_error("bad input");
char buf[MAX_DEC_LEN+1];
strncpy(buf, str, MAX_DEC_LEN+1);
char* point(NULL);
if ((point = strchr(buf, '.')) != NULL)
*(point++) = '\0';
std::decimal::decimal64 ret(atoi(buf));
if (point != NULL && *point != '\0')
{
int exponent(strlen(point));
long long unsigned coeff(atoi(point));
std::decimal::decimal64 d2(std::decimal::make_decimal64(coeff, -exponent));
if (*buf == '-')
ret -= d2;
else
ret += d2;
}
return ret;
}
std::string ToString(std::decimal::decimal64 dec)
{ …Run Code Online (Sandbox Code Playgroud) 我们有一个部署了启用apport的Ubuntu服务器,如图所示.
~$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c
Run Code Online (Sandbox Code Playgroud)
不幸的是,apport处理非打包应用程序崩溃的行为并不完全符合我们的喜好.apport在这些场景中的工作目录中生成"核心"文件(假设ulimit -c已正确设置).例如,从apport日志中,
ERROR: apport (pid 10117) Tue Jan 8 08:56:25 2013: executable: /home/jess/a.out (command line "./a.out")
ERROR: apport (pid 10117) Tue Jan 8 08:56:25 2013: executable does not belong to a package, ignoring
ERROR: apport (pid 10117) Tue Jan 8 08:56:25 2013: writing core dump to /home/jess/core (limit: 18889465931478580853760)
Run Code Online (Sandbox Code Playgroud)
令人沮丧的是,一旦核心文件存在,它就不会被覆盖.因此,例如,如果我们正在测试应用程序并忘记从工作目录中清除旧的核心文件,那么应用程序在测试期间崩溃,我们将看不到新的核心文件.即使它被覆盖了,这可能也不理想,因为我们失去了旧核心.
理想情况下,我们希望能够通过参数告诉apport,对于非打包的应用程序,生成一个核心文件,其文件名根据指定的模式进行格式化(根据core_pattern文件规范). ..有没有办法做到这一点,或等同的东西?
我想知道使用sequenceT 时是否可以“拓宽”我的最终Reader 类型?当使用 chainW 等顺序链接操作时,这是可能的,但看起来在使用 sequenceT 时,您会遇到每个项目都必须使用相同的 Reader 类型的问题。我想这样做,以便我能够在适当的情况下并行执行某些任务,但仍然能够通过 Reader 使用依赖项注入。
例子:
import { sequenceT } from 'fp-ts/lib/Apply'
import { log } from 'fp-ts/lib/Console'
import { pipe } from 'fp-ts/lib/function'
import * as RT from 'fp-ts/ReaderTask'
interface Person {
name: string
}
const getMe = (name: string) => (deps: { api: any }) => async (): Promise<Person> => {
const person = {
name,
}
return person
}
const getMum = (child: Person) => (deps: { api2: any }) => …Run Code Online (Sandbox Code Playgroud)