相关疑难解决方法(0)

在Java中使用双倍

我找到了这个很好的舍入解决方案:

static Double round(Double d, int precise) {
    BigDecimal bigDecimal = new BigDecimal(d);
    bigDecimal = bigDecimal.setScale(precise, RoundingMode.HALF_UP);
    return bigDecimal.doubleValue();
}
Run Code Online (Sandbox Code Playgroud)

但是,结果令人困惑:

System.out.println(round(2.655d,2)); // -> 2.65
System.out.println(round(1.655d,2)); // -> 1.66
Run Code Online (Sandbox Code Playgroud)

为什么要提供这个输出?我正在使用jre 1.7.0_45.

java floating-point

57
推荐指数
6
解决办法
3486
查看次数

如何在golang中将float64类型截断为特定的精度?

package main

import (
    "fmt"
    "strconv"
    )

func main() {
    k := 10/3.0
    i := fmt.Sprintf("%.2f", k)
    f,_ := strconv.ParseFloat(i, 2)
    fmt.Println(f)
}
Run Code Online (Sandbox Code Playgroud)

我必须编写上面的程序,以将go float64变量的精度降低到2.在这种情况下,我使用了strconv和fmt.是否有其他逻辑方法可以完成?

floating-point go

49
推荐指数
7
解决办法
6万
查看次数

to_d总是在ruby中返回2个小数位

我正在处理货币,我想将数字向下舍入到小数点后2位.即使数字是500.0,我希望它是500.00才能保持一致.当我执行"500.00".to_d时,它将其转换为500.0.

什么是改变这种行为的好方法?我也使用这种方法向下舍入到2位数,并确保它总是有2位小数.

def self.round_down(x, n=2)
    s = x.to_s      
    l = s.index('.') ? s.index('.') + 1 + n : s.length
    s = s[0, l]
    s =  s.index('.') ? s.length - (s.index('.') + 1) == 1 ? s << '0' : s : s << '.00'      
    s.to_f
end
Run Code Online (Sandbox Code Playgroud)

ruby math currency ruby-on-rails decimal

48
推荐指数
4
解决办法
6万
查看次数

显示的货币格式

是否有图书馆格式化一个国家的正确货币代表?

英国示例 - £127.54荷兰€127,54-美国$ 127.54

等等..

有些事情要考虑,

  1. 货币符号

  2. 货币符号展示位置 - 可以是数字之前或之后的位置.

  3. 负数量显示

.net c# asp.net globalization currency

46
推荐指数
4
解决办法
11万
查看次数

使用BigDecimal作为货币的一个现实例子明显优于使用double

我们知道使用double货币是容易出错的,不推荐使用.但是,我还没有看到一个现实的例子,BigDecimal虽然double失败了,但不能通过一些舍入来简单地修复.


注意琐碎的问题

double total = 0.0;
for (int i = 0; i < 10; i++) total += 0.1;
for (int i = 0; i < 10; i++) total -= 0.1;
assertTrue(total == 0.0);
Run Code Online (Sandbox Code Playgroud)

不计算,因为它们通过舍入(在这个例子中从0到16的小数位的任何东西)都可以解决.


涉及总结大值计算可能需要一些中间圆棒,但由于流通总货币之中USD 1e12,爪哇double(即标准IEEE双精度其15个十进制数字)仍然是足够美分事件.


涉及分工的计算通常是不精确的,即使是BigDecimal.我可以构造一个不能用doubles 执行的计算,但可以BigDecimal使用100的标度执行,但它不是你在现实中可以遇到的东西.


我没有声称这样一个现实的例子不存在,只是我还没有看到它.

我也肯定同意,使用double更容易出错.

我正在寻找的是如下方法(根据Roland Illig的回答)

/** 
  * Given an input which has three decimal …
Run Code Online (Sandbox Code Playgroud)

java floating-point currency biginteger

44
推荐指数
5
解决办法
6806
查看次数

什么是浮点/舍入误差的简单示例?

我在使用浮点变量时听说过"错误".现在我正在尝试解决这个难题,我想我得到了一些舍入/浮点错误.所以我最终要弄清楚浮点错误的基础知识.

什么是浮点/舍入误差的简单示例(最好是在C++中)?

编辑:例如说我有一个成功概率为p的事件.我做了10次此事件(p没有变化,所有试验都是独立的).两次成功试验的概率是多少?我把它编码为:

double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
Run Code Online (Sandbox Code Playgroud)

这是浮点错误的机会吗?

c++ floating-accuracy

32
推荐指数
7
解决办法
3万
查看次数

Swift 3 Decimal,NSDecimal和NSDecimalNumber

我正在尝试使用NumberFormatterSwift 3 Decimal,但我对如何Decimal实现真正感到困惑.我遇到的问题是这Decimal是一个结构,所以NSDecimalNumber每次我想使用格式化程序时我都必须将它连接起来,我想避免使用它.

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let decimal = Decimal(integerLiteral: 3)
let string = formatter.string(from: decimal as NSDecimalNumber)
Run Code Online (Sandbox Code Playgroud)

这是实现我自己的扩展需要一个理想的解决方法Decimal吗?

extension NumberFormatter {
    open func string(from number: Decimal) -> String? {
        return string(from: number as NSDecimalNumber)
    }
}
Run Code Online (Sandbox Code Playgroud)

更一般地说,每次我需要传入一个对象类型我是否需要桥接Decimal或编写更多扩展?

编辑

我想我更喜欢NSDecimal DecimalNSDecimalNumberSwift 3一样.我根本不清楚这里发生了什么.我应该替换NSDecimalNumberDecimal的斯威夫特3?文档写道:

Swift覆盖到Foundation框架提供了Decimal结构,该结构桥接到NSDecimalNumber类.Decimal值类型提供与NSDecimalNumber引用类型相同的功能,并且这两者可以在与Objective-C API交互的Swift代码中互换使用.此行为类似于Swift如何将标准字符串,数字和集合类型桥接到其对应的Foundation类.

起初我以为意味着Decimal是新的NSDecimalNumber一样Error是新的NSError-但现在我不那么肯定.这也说'十进制值类型提供与NSDecimalNumber引用类型相同的功能' - 这是真的吗?我似乎无法获得相同的功能(首先没有桥接,当然,这是他们的意思吗?).我在这里和那里找到了一些帖子和一些信息,但没有任何令人信服的信息.有没有人有任何知识或见解? …

ios swift swift3

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

如何使用Java的DecimalFormat进行"智能"货币格式化?

我想使用Java的DecimalFormat来格式化双打,如下所示:

#1 - 100 -> $100
#2 - 100.5 -> $100.50
#3 - 100.41 -> $100.41
Run Code Online (Sandbox Code Playgroud)

到目前为止我能想出的最好的是:

new DecimalFormat("'$'0.##");
Run Code Online (Sandbox Code Playgroud)

但这不适用于案例#2,而是输出"$ 100.5"

编辑:

很多这些答案只考虑案例#2和#3而没有意识到他们的解决方案会导致#1将100格式化为"$ 100.00"而不仅仅是"$ 100".

java formatting decimalformat

29
推荐指数
3
解决办法
7万
查看次数

舍入错误?

在我的课程中,我被告知:

连续值大约在内存中表示,因此使用浮点数计算涉及舍入误差.这些是位模式的微小差异; 因此,e==f如果是漂浮物e,f则测试是不安全的.

参考Java.

这是真的?我使用了doubles和floats的比较语句,并且从未遇到过舍入问题.从来没有我在课本上读过类似的东西.当然虚拟机占了这个?

java memory floating-accuracy

22
推荐指数
3
解决办法
2万
查看次数

如何限制双打印的小数位数?

这个程序有效,除非nJars的数量是7的倍数,我会得到一个答案,如$ 14.999999999999998.对于6,输出为14.08.如何修复7的倍数的异常,这样它会显示14.99美元?

import java.util.Scanner;
public class Homework_17
{
 private static int nJars, nCartons, totalOunces, OuncesTolbs, lbs;

 public static void main(String[] args)
  {
   computeShippingCost();
  }

  public static void computeShippingCost()
  {
   System.out.print("Enter a number of jars: ");
   Scanner kboard = new Scanner (System.in);
   nJars = kboard.nextInt();
   int nCartons = (nJars + 11) / 12;
   int totalOunces = (nJars * 21) + (nCartons * 25);
   int lbs = totalOunces / 16;
   double shippingCost =  ((nCartons * 1.44) + (lbs + 1) * 0.96) …
Run Code Online (Sandbox Code Playgroud)

java double int

22
推荐指数
3
解决办法
13万
查看次数