首页 \ 问答 \ 将对象转换为long(Converting object to long)

将对象转换为long(Converting object to long)

我有以下功能:

    public virtual long AsLong(object originalValue,long defaultValue)
    {
        double buffer = defaultValue;
        if (originalValue != null)
        {
            double result;
            var readValueIsconverted = double.TryParse(originalValue.ToString(), out result);
            if (readValueIsconverted)
                buffer = result;
        }

        var roundedValue = Math.Round(buffer, 0);
        var convertedValue = (long) roundedValue;
        return convertedValue;
    }

我使用了双倍以便允许转换为14.4! 我有以下失败的测试:

    [Fact]
    public void CanConvertLongMaxValue()
    {
        var cellValue = new Converter();
        const long longValue = 0x7FFFFFFFFFFFFFFF;
        var result = cellValue.AsLong(longValue, 12);

        Assert.Equal(longValue, result);

    } 

我已经跟踪了代码并且roundedValue是正数但convertvalue是负数。 那有什么问题呢?


I have the following function:

    public virtual long AsLong(object originalValue,long defaultValue)
    {
        double buffer = defaultValue;
        if (originalValue != null)
        {
            double result;
            var readValueIsconverted = double.TryParse(originalValue.ToString(), out result);
            if (readValueIsconverted)
                buffer = result;
        }

        var roundedValue = Math.Round(buffer, 0);
        var convertedValue = (long) roundedValue;
        return convertedValue;
    }

I have used double in order to allow conversion of 14.4! I have the following failing test:

    [Fact]
    public void CanConvertLongMaxValue()
    {
        var cellValue = new Converter();
        const long longValue = 0x7FFFFFFFFFFFFFFF;
        var result = cellValue.AsLong(longValue, 12);

        Assert.Equal(longValue, result);

    } 

I have traced the code and roundedValue is positive but the convertedValue is negative. so what is the problem?


原文:https://stackoverflow.com/questions/15038435
更新时间:2019-06-23 01:10

最满意答案

问题是你试图在一个有15-16位有效数字double中保存一个带有19位有效数字(十进制)的整数值。

因此,不可能在double准确表示值。 显然舍入会导致值在转换为long时溢出,使其成为负值。

您可以这样确认:

var convertedValue = checked((long)roundedValue);

如果你绝对必须处理这种情况,我建议使用decimal而不是double,或者将小数点上的字符串(或你的语言环境中使用的任何东西)拆分并处理这种方式的舍入。


The problem is that you're trying to hold an integer value with 19 significant digits (in decimal) in a double which has 15-16 significant digits.

Hence, it's not possible to represent the value exactly in the double. Apparently rounding causes the value to overflow when converted into a long, making it a negative value.

You can confirm this like so:

var convertedValue = checked((long)roundedValue);

If you absolutely must deal with this case, I would suggest using decimal instead of double, or splitting the string on the decimal point (or whatever is used in your locale) and dealing with rounding that way.

2013-02-23

相关问答

更多

在Java中将Object转换为Long的更理想的方法是什么?(Which is the more desirable way to convert Object to Long in Java?)

如果你知道这是一个很Long的事实,我肯定会和演员一起去。 它更清晰,可能更有效率。 如果您确定返回类型是Number ,则可以调用Number.longValue() 。 如果这不是确定的话,那么我可能会使用解析选项来保证安全并避免使用样板文件。 If you know for a fact that it's a Long, I'd definitely go with the cast. It's clearer and probably more efficient. If you're ...

将对象转换为对象数组(Converting an object into an array of objects)

您可以使用数组映射方法迭代数据数组并进行转换。 代码和现场演示: http : //jsfiddle.net/N9QyQ/ var object={ "header": { "dataFields": ["number", "name", "quantity", "id", "rom"] }, "data": [ "20|sam|12|2|2012-06-29T00:00Z", "18|peter|231|12|" ] } ; var result=object.data ...

将python long / int转换为固定大小的字节数组(Convert python long/int to fixed size byte array)

我没有做任何基准,但这个配方“适合我”。 简短版本:使用'%x' % val ,然后unhexlify调整结果。 尽管如此,恶魔unhexlify细节中,因为unhexlify需要偶数个十六进制数字,而%x并不能保证。 有关详细信息,请参阅文档字符串和自由内联注释。 from binascii import unhexlify def long_to_bytes (val, endianness='big'): """ Use :ref:`string formatting` a ...

奇怪的铸造行为。(Strange casting behaviour. Cannot cast object (int) to long)

从int到long转换被解释为两种类型之间的转换。 从object为int被解释为取消装箱的int 。 它是相同的语法,但它说两个不同的东西。 在工作的情况下( int → long , object (boxed int )→ int ),编译器会准确知道要生成的代码。 如果boxed int → long工作,编译器必须以某种方式找出要使用的转换,但没有足够的信息来做到这一点。 另见Eric Lippert的这篇博文 。 Cast from int to long is interpreted ...

python 错误提示'long' object is not iterable

输出download_dict[city][puid][dt]看看里面是什么,应该就是long。 不是可以用来循环的变量。 不清楚download_dict的结构和你的目的。 1,目测download_dict[city][puid][dt]应该是一个数字的列表例如[111,222,33333,4444] 所以需要修改download_dict[city][puid][dt]的值或者修改代码 2,如果download_dict[city][puid][dt]是一个数字的话例如12345 那就不需要 ...

GORM映射宣言::长或不长(GORM Mapping Manifesto :: To Long or not to Long)

我无法想象任何真实的场景,其中Integer和Long之间的差异会对性能产生任何明显的差异(这似乎是进行此更改的最初动机)。 如果使用Long工作,但Integer导致问题,那么使用Long并转移到更重要的任务。 如果你能证明使用Integer会产生重大影响,我只会担心这一点。 更新 你是对的,我完全忽略了Grails自动用于Long的数据库类型。 您似乎已经知道,您可以在域类的映射闭包中控制数据库类型,例如 class Person { Long id static mapping ...

精度损失转换为双倍有多大?(How big is the precision loss converting long to double?)

将long (或任何其他表示数字的数据类型)转换为double会丢失精度。 由于浮点数的表示,这是非常明显的。 这似乎并不明显,因为精确度损失取决于long的值。 对于-252和2 52之间的值,根本没有精度损失。 如果我将更大的数字转换为双倍,精度的损失有多大? 我是否需要预期差异大于+/- X 对于数量大于2 52的数字,您将会遇到一些精确度损失,具体取决于您所使用的52位数限制。 如果你的long的绝对值适合于比如58位,那么你的精度损失的幅度将是58-52 = 6位或+/- 64。 dec ...

将long long number转换为c中的char数组(conver long long number to a char array in c)

你必须使用: void convertToCharArray(unsigned char *arr, long long a) { int i = 0; for (i = 0; i < 8; ++i) { arr[i] = (unsigned char)((((unsigned long long) a) >> (56 - (8*i))) & 0xFFu); } } int main() { long long a = 123456; ...

相关文章

更多

最新问答

更多
  • Android宽度:100%修复(网站接管问题)(Android width:100% fix (website takeover issue))
  • C ++函数/方法设计的良好实践(Good practice in C++ function/method design)
  • 计算其他表中不存在的所有记录 - SQL查询(Count all records that does not exist to other table - SQL Query)
  • 为什么我要用JPA共享ID?(Why do I get shared Ids with JPA?)
  • asp.net - 如何显示来自html格式的数据行的字段(asp.net - how to display a field from data row that is in html format)
  • 我们如何使用ActiveRecord从连接表中删除行?(How can we delete rows from a join table by using ActiveRecord?)
  • ng-class搞乱了类的顺序(ng-class messing with the order of classes)
  • oracle 12g无效数字错误(oracle 12g invalid number error)
  • 更改ng-src值onclick(Change ng-src value onclick)
  • 如何在android中自动添加自定义依赖项以创建新项目?(How to add custom dependencies automatically in android for ever a new project is created?)
  • datetime函数在PHP中(datetime function in php)
  • 在javascript中获取会话数组的值(in javascript get the value of a session array)
  • 如何在UTF8中编译LaTeX?(How can I compile LaTeX in UTF8? [closed])
  • Rspec:“array.should == another_array”,但不用担心订单(Rspec: “array.should == another_array” but without concern for order)
  • Logcat错误:无法在android片段中加载视图(Logcat error: unable to load view in android fragments)
  • JavaFX的。(JavaFX. Adding items to the list in different threads is not working)
  • 从GDATA日历资源迁移到Google Calendar Resource api(Migrate from GDATA calendar resource to Google Calendar Resource api)
  • SSRS 2008 - 以零情景处理分割(SSRS 2008 - Dealing with division by zero scenarios)
  • 我如何以编程方式添加一个listView列标题的点击事件(How can I add a listView column header a click event programmatically)
  • Wxpython:无法检索有关列表控件项XXX的信息(Wxpython: Couldn't retrieve information about list control item XXX)
  • 使用Tortoise SVN在SVN存储库中移动目录(Move Directory across SVN repository using Tortoise SVN)
  • 天蓝色服务结构集群中的web api无状态服务是否在一段时间不活动后进入休眠状态?(Do web api stateless services in azure service fabric cluster go to sleep after a period of inactivity?)
  • 我可以设置intelliJ来突出显示PHP编码风格吗?(Can I set intelliJ to highlight php coding style?)
  • 用javafx创建一个Truetype字体文件(Creating a Truetype Font file with javafx)
  • Spring ftp配置错误(Spring ftp configuration is wrong)
  • 使用gsub去除多个字符(Using gsub to strip multiple characters)
  • 续订推送证书并保持当前的App Store App正常工作(Renew Push certificate and keep current App Store App working)
  • js:ES5和ES6之间关于'this'关键字用法的一个令人困惑的观点(js: one confusing point about 'this' keyword usage between ES5 and ES6)
  • window.onload vs $(document).ready()(window.onload vs $(document).ready())
  • 在Swift中,如何声明一个符合一个或多个协议的特定类型的变量?(In Swift, how can I declare a variable of a specific type that conforms to one or more protocols?)