舍入数值意味着将其替换为大致相等但具有更短,更简单或更明确的表示的另一个值。
我有一个Python Decimal(货币金额),我想将其四舍五入到小数点后两位。我尝试使用常规 round() 函数来执行此操作。不幸的是,这会返回一个浮点数,这使得它
PostgreSQL 中的 round(numeric,integer) 函数仅向上舍入: round(cast (41.0255 as numeric),3) ==> 41.026 因为我们需要一个返回 41.025 的舍入函数并且(非常令人惊讶)...
我正在尝试切换到“新”tidyverse 生态系统,并尽量避免加载 Wickham 等人的旧包。我以前曾经依赖我的编码。我从 plyr 中找到了 round_any 函数
为什么 BigDecimal 除法中的 RoundingMode.HALF_EVEN 将 0.454 舍入为 0.5?
舍入模式 HALF_EVEN 应该将以 5 结尾的(十进制)数字舍入到最接近的甚至不太精确的数字(例如,4.5 舍入为 4,而 5.5 舍入为 6)。 现在看来……
我有一个双精度数(称之为x),本来是55,但实际上存储为54.999999999999943157,我刚刚意识到。 所以当我这样做时 双x = 54.999999999999943157; int y = (int) x; y = 54 相反...
我有一个双精度数(称之为x),本来是55,但实际上存储为54.999999999999943157,我刚刚意识到。 所以当我这样做时 双x = 54.999999999999943157; int y = (int) x; y = 54 相反...
我正在尝试实现带有舍入的整数除法。显然,默认情况下整数除法会取整,我想我可以使用余数来确定是否应该在结果中加 1。
我有一些代码可以解析浮点数,如果可以将数字转换为无符号而不丢失精度,则返回无符号整数: #包括 #包括 我有一些代码可以解析浮点数并返回一个无符号整数(如果该数字可以转换为无符号而不丢失精度): #include <charconv> #include <string_view> #include <stdint.h> uint64_t read_uint(std::string_view num) { double d; auto r = std::from_chars(num.data(), num.data() + num.size(), d); if (r.ec == std::errc() && r.ptr == num.data() + num.size()) { uint64_t u = (uint64_t)d; if (d == u + 0.0) // conversion back to a double produced identical value return u; } return ~0ull; // error, return -1 } 期望是: assert(read_uint("1.0") == 1); assert(read_uint("1.0654553e+07") == 10654553); assert(read_uint("1.1") == ~0ull); // error assert(read_uint("-123") == ~0ull); // error 但是,当以 avx/avx2/avx512 为目标并使用 -fast-math 时,此代码在 x64/x86 优化构建上惨遭失败。具体来说,解析负数失败: assert(read_uint("-123") == ~0llu); 它不是返回 -1,而是实际返回 -123(转换为 uint64_t)。失败的原因是因为转换回 double 来验证结果是否相同会产生不同的结果: uint64_t u = (uint64_t)d; if (d == u + 0.0) // u + 0.0 produces different result return u; 顺便说一句,当瞄准avx512时,投射也会产生不同的价值: uint64_t u = (uint64_t)d; // u might not be exact when targeting avx512 显然,这段代码充满了错误和陷阱,我有一些问题: 有什么问题,有UB吗? (忽略像底层 uint64_t 这样明显的东西可能无法用双精度表示) 为什么uint64_t u = (uint64_t)d用fast-math和avx512产生不同的结果? 为什么u + 0.0用fast-math和avxN产生不同的结果? 这里正确的方法应该是什么? 是否有编译时标志来识别代码中此类可能的情况? 注意,对于 MS 编译器,我没有看到上述任何问题。无论优化、浮点模型或目标架构如何,值始终准确/相同。 顺便说明一下,这并不是产品中使用的确切代码,而是其中的一些摘录。它解析由 Polygon.io json API 返回的数字。也许,他们不小心使用 python 转储了数字,我见过一些情况,其中值是“1.0”、“1.0654553e+07”等,而不是普通整数。到目前为止,作为一个简单的解决方法,我将转换为 uint64_t 更改为: uint64_t u = (uint64_t)fabs(d); 最小示例:https://godbolt.org/z/cKzrK6ven(如果从 clang cmdline 输出中删除 -O2 将会改变) 是的,您的代码有未定义的行为。 N4928 转换 fpint p1 浮点类型的纯右值可以转换为整数类型的纯右值。转换截断; 即小数部分被丢弃。如果无法表示截断值,则行为未定义 在目的地类型中。 截断值为-123,无法在目标类型中表示uint64_t(它只能表示非负值),因此这是未定义的行为。 请注意,无论您使用 C 风格转换 (uint64_t)d 还是 static_cast<uint64_t>(d),这都适用。 确实,将值为 -123 的 integer 类型的值转换为 uint64_t 会产生明确定义的结果(即 2^64 - 123 = 18446744073709551493)。 但这不适用于转换浮点类型的值。
如何在 C++ 中启用“roundties toaway”舍入模式?
我正在尝试使用舍入到最近、舍入到远离模式在 C++17 中执行浮点运算。在 cppreference.com 上搜索我发现有四种舍入模式可用,包括
我目前正在尝试从 API 收集一些天气数据,并为了减少 API 调用量,我尝试根据其分辨率对 0.5 度经度和纬度块进行批量调用。 我...
如何根据 Google 表格中给定的开始日期和今天的日期获取下一个双周日期
我正在尝试根据开始日期获取双周日期,然后提供从开始日期开始的 14 天序列之后的下一个即将到来的日期,以获取今天之后的日期'...
C 中是否有对浮点数进行四舍五入的函数,或者我需要编写自己的函数吗?
C 中是否有一个函数可以对浮点数进行四舍五入,还是我需要编写自己的函数? 浮动转换器= 45.592346543; 我想将实际值四舍五入到小数点后一位,conver = 45.6。
我有这两个变量 双数 = 540.512 双倍总和 = 1978.8 然后我做了这个表达 双精度总计 = Math.round((num/ sum * 100) * 10) / 10; 但我最终得到的是 27.0。 其实我有很多
php 整数 - 当 echo 时显示 2 位小数,如果打印到 CSV 则显示 .0999999
使用 http://www.maatwebsite.nl/laravel-excel/ 导出到 CSV 和 Excel。 我有一个 $rows 数组,其中包含所有行及其列。 有些列使用 number_format(ro...
我没有看到 Math.Round 的预期结果。 返回 Math.Round(99.96535789, 2, MidpointRounding.ToEven); // 返回 99.97 据我了解 MidpointRounding.ToEven,千分之五
我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是 1.234 * 1000.,代码基本上可以归结为: #包括 我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是1.234 * 1000.,代码基本上可以归结为: #include <stdio.h> #include <stdint.h> int64_t deltatime(double numSeconds) { return (int64_t) (numSeconds * 1000.0); } int main() { double s = 1.234; int64_t ms = deltatime(s); printf("%fs -> %dms\n", s, ms); return 0; } 现在为 x86-64 编译这个,给我: $ gcc test.c && ./test 1.234000s -> 1234ms 针对 x86-32 编译它,给我: $ gcc -m32 test.c && ./test 1.234000s -> 1233ms (这是与 $ gcc --version gcc (Debian 14.2.0-7) 14.2.0 ) 现在,我明白数字 1.234 无法在 IEEE-754 中准确表示, 例如在单精度浮点数中,它确实是 1.2339999675750732421875,同样,在双精度浮点数中,它是 1.2339999999999999857891452848。 现在,将实际值乘以1000.0(可以精确表示),应该总是给我1233.9999...,并将其转换为int64_t实际上会是1233(而不是天真的预期的1234) . 但是为什么我在 x86-64 上得到 1234(没有为编译器指定任何舍入选项)? 正确的解决方案是否只是将 0.5 添加到总和中(before 转换为 int64_t)? int64_t deltatime(double numSeconds) { return (int64_t) (numSeconds * 1000.0 + 0.5); } 从 C++11 开始,您可以 #include <cmath> 并使用 std::llround()。
我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是 1.234 * 1000.,代码基本上可以归结为: #包括 我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是1.234 * 1000.,代码基本上可以归结为: #include <stdio.h> #include <stdint.h> int64_t deltatime(double numSeconds) { return (int64_t) (numSeconds * 1000.0); } int main() { double s = 1.234; int64_t ms = deltatime(s); printf("%fs -> %dms\n", s, ms); return 0; } 现在为 x86-64 编译这个,给我: $ gcc test.c && ./test 1.234000s -> 1234ms 针对 x86-32 编译它,给我: $ gcc -m32 test.c && ./test 1.234000s -> 1233ms (这是与 $ gcc --version gcc (Debian 14.2.0-7) 14.2.0 ) 现在,我明白数字1.234无法在IEEE-754中精确表示, 例如在单精度浮点数中,它确实是 1.2339999675750732421875,同样,在双精度浮点数中,它是 1.2339999999999999857891452848。 现在,将实际值乘以1000.0(可以精确表示),应该总是给我1233.9999...,并将其转换为int64_t实际上会是1233(而不是天真的预期的1234) . 但是为什么我在 x86-64 上得到 1234(没有为编译器指定任何舍入选项)? 正确的解决方案是否只是将 0.5 添加到总和中(before 转换为 int64_t)? int64_t deltatime(double numSeconds) { return (int64_t) (numSeconds * 1000.0 + 0.5); } 自 C++11 起,您可以 #include <cmath> 并使用 std::llround()。
我正在开发一个项目,该项目实现运费等基本成本,我需要能够格式化 toString 以便它显示带有两位小数的成本。我已经做了一些
我有这个信息。 让 params2: [字符串: AnyObject] = [ “app_token”:myapptoken, “member_access_token”:accessToken!, “付款流程”:0, "payamount_credit": 9.87 //硬编码 ] 当 p...