我使用的是HALF_UP舍入模式DecimalFormat的,我有地方工作不正常的escenery,我不知道为什么.
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
float tmp = (float) (0.5 * 1.05);
df.format(tmp);
float mul = Float.parseFloat(df.format(tmp));
Run Code Online (Sandbox Code Playgroud)
该mul变量的值,我希望有0.53值,我收到0.52值.
我正在使用Java 1.8.0_131.
已解决的最终法规
BigDecimal mul = new BigDecimal(0.5).multiply(new igDecimal(1.05));
mul = mul.setScale(2, RoundingMode.HALF_UP);
System.out.println(mul);
Run Code Online (Sandbox Code Playgroud) 我有一个haskell函数,看起来像这样:
x 1 = 1 :: Double
x n = ((n-1)/3 + 1/(n-1)) * ((x (n-1))^2) - (n-1)^3/3 + 1 :: Double
Run Code Online (Sandbox Code Playgroud)
不用考虑公式,它应该只加一个,所以x 2 = 2; x 3 = 3,依此类推。但是在Haskell中的结果是:
*Main> x 2
2.0
*Main> x 3
2.9999999999999996
*Main> x 4
3.9999999999999964
*Main>
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我,我需要在第二行中加上什么,以便将数字四舍五入到6个十进制数字吗?我不想解析为int!
谢谢!
所以我有这个代码
public String getRounded(double amount) {
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(df.format(amount));
System.out.println(amount);
return df.format(amount);
}
Run Code Online (Sandbox Code Playgroud)
我添加了这两行以查看差异,这是它们显示的示例.
输出就是这样的例子:
1.25
1.255
为什么会这样?HALF_UP的重点不在于此吗?我已经尝试过使用CEILING并且它会进行整理,尽管在这种情况下这不是我想要的.
谢谢
有谁知道如何将数字舍入到最接近的.0125?例如,有一个数字167.1131然后它需要转换为167.1125.我已经尝试过这样做,round但它会转到0.x.
是否有可以将数字拆分成多个部分的库,但确保所有部分都是舍入数字?
例如,将100分成3将是33.33,但我希望它被舍入并确保总和保持为100:
[34 33 33]
我开始使用Miran Lipovaca着名的书来学习Haskell ,但是在与格拉斯哥Haskell编译器的交互式shell(ghci)的第一次交互中,我的好奇心阻止了我.
特别是,我开始通过划分两个整数来获得浮点十进制数,基本上看看Haskell如何自动管理它们并了解更多关于它的自动转换.
?> 1/3
0.3333333333333333
?> 4/3
1.3333333333333333
?> 3424/3
1141.3333333333333
Run Code Online (Sandbox Code Playgroud)
这些告诉我Haskell总共使用了17位数字(或18个字符,包括点?),无论它们是否重要.然而,这些也发生了
?> 14/3
4.666666666666667
?> 34/3
11.333333333333334
?> 44/3
14.666666666666666
Run Code Online (Sandbox Code Playgroud)
为什么第一个缩短一位数?为什么其他人错误地四舍五入?
可能这是一个愚蠢的问题,但我想知道这些基本事情的答案,我可以从更深入地理解语言(或翻译?)的工作方式开始,通过了解更多内容.
我有一个函数做一些数学计算并返回一个double.由于std::exp实现方式不同,它在Windows和Android下会得到不同的结果(为什么我得到std :: exp的特定于平台的结果?).e-17舍入差异得到了传播,最终它不仅仅是我得到的舍入差异(结果最终可以改变2.36到2.47).当我将结果与某些预期值进行比较时,我希望此函数在所有平台上返回相同的结果.
所以我需要围绕我的结果.这样做的最简单的解决方案显然是(据我在网上找到)std::ceil(d*std::pow<double>(10,precision))/std::pow<double>(10,precision).但是,根据平台的不同,我觉得这仍然会得到不同的结果(此外,很难确定precision应该是什么).
我想知道是否硬编码最不重要的字节double可能是一个很好的舍入策略.
这个快速测试似乎表明"是":
#include <iostream>
#include <iomanip>
double roundByCast( double d )
{
double rounded = d;
unsigned char* temp = (unsigned char*) &rounded;
// changing least significant byte to be always the same
temp[0] = 128;
return rounded;
}
void showRoundInfo( double d, double rounded )
{
double diff = std::abs(d-rounded);
std::cout << "cast: " << d << " rounded to " << rounded …Run Code Online (Sandbox Code Playgroud) 我想在df中将数字四舍五入,但25、50或75应该是100,125应该是100,150或175应该是200。220应该是200,依此类推。
换句话说,如果数字小于100,则应四舍五入为100,大于100的数字应四舍五入,如果小于50,则取整为最接近的整数。
可以说我的数据框是
df <- data.frame(replicate(1,sample(0:999,100,rep=TRUE)))
colnames(df) <- c("data")
Run Code Online (Sandbox Code Playgroud)
我尝试了这个:
result <- df %>%
mutate(
data = round(if_else(data <= 100, 100, as.numeric(data)), 100)
)
Run Code Online (Sandbox Code Playgroud)
但是只有第一部分有效,如果数量小于100,则将其设为100。我在做什么错?
这是一个非常简单的问题,但需要专家回答。
我们知道,在浮点低于正常,我们摆脱掉的差距2^emin和0。
通过半圆整(RTE)模式,我们应将无限精度结果四舍五入为(0.1111...1|r)*2^emin或(1.1111...1|r')*2^(emin-1)?该点左侧的数字是隐式位。
对于第一种情况:
在论文中,每个计算机科学家都应该了解浮点算术数值计算的知识,在图2中,我看到其左侧2^emin的空间与右侧的空间相同。因此,直接地,左边数字的数值是2^emin - 2^(1-p)(p=24在flp32中)。如果我们进行RTE舍入,似乎我们应该使用24bit有效位之后的位作为舍入位(即(0.111_1111_1111_1111_1111_1111|r)*2^emin,请参见
--|---+---+....+-?-|---+---+....+---|-------+........
--0---------------2^emin---------2^emin+1
Run Code Online (Sandbox Code Playgroud)
我?在轴上使用问号()表示半点
对于第二种情况:在IEEE标准中,对于次正规检测,在四舍五入之前说“无界”指数blabla。因此,如果我们可以具有无穷大的指数,则可以将精确结果移到(1.1111...1|r')*2^(emin-1)。在这种情况下,我们在上保留了一半的左空间2^emin。这与上的所有其他相邻空格相似2^e,但是一旦在轴上接近0,空格的数量将变为无限。看到
--|...++++|-+-+-+...|---+---+....+-?-|-------+........
--0-....----------2^emin-1----------2^emin
------| here is keep shrinking
Run Code Online (Sandbox Code Playgroud)
在这种情况下,似乎我们应该将精确结果四舍五入为
(1.111_1111_1111_1111_1111_1111|r')*2^(emin-1)
Run Code Online (Sandbox Code Playgroud)
通过将情况1的结果左移1位,表示保护位在这种情况下很有用。
在这两种情况下,我们具有不同的舍入位,因此可能会得到不同的结果。我们应该遵循哪种情况?我看不到任何有关此主题的文档/论文。
寻找一种简单的方法,例如EXCEL“增加小数”,“减少小数”
# Example number
d <- c(0.6199548,0.8884106,0.9030066)
# Expected result :
[1]62% 89% 90%
# library scales result cannot adjust to 0 decimal
percent(d)
[1] "62.0%" "88.8%" "90.3%"
# Cannot handle sprinf() function well as weird result generated like below:
sprintf("%.1f %%", d)
[1] "0.6 %" "0.9 %" "0.9 %"
Run Code Online (Sandbox Code Playgroud)
我们是否有简单的软件包可以像R中的EXCEL一样容易地调整小数百分比?