我正在进行一些人口建模(为了好玩,主要是为了实现承载能力和后勤功能的概念).该模型适用于多个行星(目前约有100,000个行星).当人口达到一个行星的承载能力时,居民开始分支到附近的行星,依此类推.
问题:10万多颗行星可以容纳很多人.不仅仅是C#Decimal可以处理.由于我使用这些数字做平均值和其他东西,我需要能够使用浮点(或者我只使用BigInt库).
有谁知道我可以使用的BigFloatingPoint类(或其他)?谷歌今天非常无益.我可以编写一个可以运行得很好的类,但是如果存在这样的东西,我宁愿使用预先存在的东西.
如果将ActiveRecord列类型指定为十进制,则Rails会将该数据库值作为ruby BigDecimal对象返回.
我的问题是,当使用这些字段并对它们执行额外的数学运算时,我是否应该在计算中始终使用BigDecimal值,或者可以使用浮点值.我不知道在同一计算中混合BigDecimal值和浮点值是否是一个好习惯.
混合示例:BigDecimal.new('12 .43')/ 4.2
相同类型示例:BigDecimal.new('12 .43')/ BigDecimal.new('4.2')
我问的原因是因为我需要使用浮点数,因为我需要十进制精度.使用浮点数0.1 + 0.7不等于0.8.
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()
Run Code Online (Sandbox Code Playgroud)
这回来了10.但根据API,divide方法:
返回一个BigDecimal,其值为(this/divisor),其首选标度为(this.scale() - divisor.scale());
所以在这种情况下,37146555.53880000's规模是8,而且1000000规模是0.所以结果应该有一个规模8,而不是10.
我在这里错过了什么?
谢谢
虽然与Java相比,从Doubles到BigDecimals 的转换情况有所改善
scala> new java.math.BigDecimal(0.2)
res0: java.math.BigDecimal = 0.20000000000000001110223024625156...
scala> BigDecimal(0.2)
res1: scala.math.BigDecimal = 0.2
Run Code Online (Sandbox Code Playgroud)
等等
val numbers: List[BigDecimal] = List(1.2, 3.2, 0.7, 0.8, 1.1)
Run Code Online (Sandbox Code Playgroud)
工作得很好,有一个隐含的转换是不合理的
implicit def String2BigDecimal(s: String) = BigDecimal(s)
Run Code Online (Sandbox Code Playgroud)
默认情况下可以将字符串转换为BigDecimals吗?
val numbers: List[BigDecimal] = List("1.2", "3.2", "0.7", "0.8", "1.1")
Run Code Online (Sandbox Code Playgroud)
还是我失去了一些东西和Scala解决Java的所有"问题"使用的BigDecimal构造与浮点值,而不是一个String,并且BigDecimal(String)基本上不斯卡拉不再需要?
为什么以下代码打印0.00而不是0?
BigDecimal big = new BigDecimal("0.00");
big = big.stripTrailingZeros();
System.out.println(big.toPlainString());
Run Code Online (Sandbox Code Playgroud)
以下是stripTrailingZeroes的文档:
返回BigDecimal,它在数值上等于此值,但从表示中删除了任何尾随零.例如,从BigDecimal值600.0剥离尾随零,其中[BigInteger,scale]组件等于[6000,1],产生6E2,[BigInteger,scale]组件等于[6,-2]
返回:
数字等于BigDecimal,删除任何尾随零.
我想将Java BigDecimal舍入到一定数量的有效数字(非小数位),例如4位数:
12.3456 => 12.35
123.456 => 123.5
123456 => 123500
基本问题是如何找到BigDecimal的数量级,因此我可以决定小数点后使用的位数.
我能想到的只是一个可怕的循环,除以10直到结果<1,我希望有更好的方法.
顺便说一句,这个数字可能非常大(或非常小)所以我无法将其转换为双倍以使用登录它.
nil can't be coerced into BigDecimal当我尝试执行计算时为什么会得到:这是代码:
模型/ drink.rb
class Drink < ActiveRecord::Base
belongs_to :menu
before_save :total_amount
def total_amount
self.total_amount = self.price * self.quantity
end
Run Code Online (Sandbox Code Playgroud)
模型/ menu.rb
class Menu < ActiveRecord::Base
has_many :drinks, :dependent => :destroy
accepts_nested_attributes_for :drinks, :allow_destroy => true
#Validations
end
Run Code Online (Sandbox Code Playgroud)
*Drink是(嵌套)子模型,Menu是父模型当我尝试创建新饮料时,浏览器显示以下错误消息 nil can't be coerced into BigDecimal app/models/drink.rb:7:in 'total-amount'
app/controllers/menus_controller.rb:47:in 'create'
app/controllers/menus_controller.rb:46:in 'create'
应用程序/分贝/迁移
class CreateDrinks < ActiveRecord::Migration
def change
create_table :drinks do |t|
t.string :name
t.decimal :quantity,:precision => 8, :scale => 2
t.decimal :price, …Run Code Online (Sandbox Code Playgroud) 以下程序冻结,我无法弄清楚原因.
import java.math.*;
public class BigDec {
public static BigDecimal exp(double z) {
// Find e^z = e^intPart * e^fracPart.
return new BigDecimal(Math.E).pow((int)z, MathContext.DECIMAL128).
multiply(new BigDecimal(Math.exp(z-(int)z)), MathContext.DECIMAL128);
}
public static void main(String[] args) {
// This works OK:
BigDecimal x = new BigDecimal(3E200);
System.out.println("x=" + x);
System.out.println("x.movePointRight(1)=" + x.movePointRight(1));
// This does not:
x = exp(123456789);
System.out.println("x=" + x);
System.out.println("x.movePointRight(1)=" + x.movePointRight(1)); //hangs
}
}
Run Code Online (Sandbox Code Playgroud)
出于目前的目的,第一种方法只是创建一个非常大的BigDecimal.(细节:它找到了z的力量,即使它太大而不是双倍.我很确定这种方法是正确的,尽管MathContexts可能不是最好的地方.)
我知道e ^ 123456789非常大,但我确实想要使用这样的数字.非常感谢任何答案.
每次我运行我的assertEquals时,我的预期BigDecimal都会被舍入,导致它失败.我如何确保它不圆或有另一种方式?
@Test
public void test() {
BigDecimal amount = BigDecimal.valueOf(1000);
BigDecimal interestRate = BigDecimal.valueOf(10);
BigDecimal years = BigDecimal.valueOf(10);
InterestCalculator ic = new InterestCalculate(amount, interestRate, years);
BigDecimal expected = BigDecimal.valueOf(1321.507369947139705200000);
assertEquals(expected, ic.getMonthlyPaymentAmount());
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
xwork-conversion.properties
java.math.BigDecimal=demo.BigDecimalConverter
Run Code Online (Sandbox Code Playgroud)
BigDecimalConverter.java
package demo;
import java.math.BigDecimal;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class BigDecimalConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class clazz) {
System.out.println("BigDecimal : Converting from String : " + values[0]);
return new BigDecimal(values[0]);
}
@Override
public String convertToString(Map context, Object value) {
String str = ((BigDecimal)value).toPlainString();
System.out.println("BigDecimal : Converted to String : " + str);
return str;
}
}
Run Code Online (Sandbox Code Playgroud)
TheAction.java
package demo;
//imports...
public class TheAction extends ActionSupport {
private BigDecimal bigField; //with getter …Run Code Online (Sandbox Code Playgroud) bigdecimal ×10
java ×6
c# ×1
formatting ×1
implicit ×1
javascript ×1
junit ×1
math ×1
scala ×1
struts2 ×1